,最好在思想上,面向中小型对于思想对象与面向过程兼有,在代码上,类、函数、宏搭配使用使用代码函数。这里提到一个可能对读者陌生的概念——宏(macro)。在macro 可能这里C语言中有宏,宏汇编中也有宏,但PHP中官方没有定义“ldquo 官方定义;宏”的概念。然而我们可以通过require函数和include函数实现宏的requir includ 我们功能。require
和include通常用来在程序代码中包含函数库或类库等includ requir 通常文件,一般很少用来直接包含程序代码文件,因为包含程一般包含直接序代码有时会降低代码易读性。当有一段代码需要在很多需要降低代码页面中都执行时,通常被想到的是把它打包为函数或封装封装通常执行为类。但此法有缺点如下:
1.
降低程序效率。因为增加了函数/类方法调用。
2.
有时此段嵌入代码较复杂,实现功能并不单纯,封进函数代码嵌入实现并不符合函数功能单纯的原则。
3.
有时嵌入代码需要与外部大量交换数据,如果封进函数会需要外部数据使参数表庞大,且处理函数的返回值也变得复杂。
4.
由于有2、3两点缺点,导致当嵌入代码与外部代码交换外部导致缺点的数据有所变化时,函数或类的接口的更改会变得麻烦。更改接口数据
当遇上以上情况时,我建议使用宏,即把嵌入代码直接写使用建议情况入被包含文件中,供各页面包含。但此时务必要清晰注释包含此时文件宏的调用方法,输入输出数据等,以弥补代码易读性的降输入数据方法低。
总之,面向对象、面向过程、类、函数、宏,这些都应根这些总之函数据具体实际情况而搭配使用,不应盲目死守某些原则。
SQL数据库
本来SQL数据库的优化不应归入PHP优化,但实际应用中PHP常数据库应用归入与SQL数据库配合构建网站,
常用的数据库有MySQL、PostgreSQL等。于postgresql 数据库 mysql是SQL查询的效率也直接影响PHP程序的效率,故本文也略为本文效率直接谈一谈。
1.
MySQL 中,使用InnoDB或BDB表(支持事务)的效率比MyISAM表(不支持innodb myisam my
sql事务)的效率低,尤其InnoDB表效率比MyISAM低很多,而BDB表的主innodb myisam 尤其要劣势在于占用磁盘空间比MyISAM表多很多,且不能查知每个myisam 磁盘占用表占用磁盘空间的大小。而对中小型应用,数据不一致性一致性中小型数据出现的概率是很微的,所以尽可使用
MyISAM表提高效率。(关myisam 使用效率于MySQL数据表的更多讨论可参考《MySQL 中三种数据表的对比》数据表
mysql 参考)
2.
恰当建立索引和存储冗余数据。此话题太大故本文不打算冗余数据打算作详述。
3.
有些SQL查询仅需知道数据库中是否存在符合条件的行,故数据库条件有些只要查得一行,搜索即可结束。所以对此类
查询,可在SQL即可
搜索结束句末加上LIMIT 1使数据库一旦搜到满足条件的行即不再搜索数据库 limit 一旦。
4.
尽量少用JOIN,有些低效率的JOIN查询可通过存储冗余数据来冗余数据效率避免。
5.
有时候需要比较现在的时间与数据库某列的时间的差距,有时候数据库需要返回时间差距满足一定条件的行。在MySQL 4.1之前,是没有mysql 条件没有DATEDIFF函数的,但可以用DATE_ADD或DATE_SUB函数简洁实现,例如要返datediff 简洁例如回xtime列距今超过10天的行,有两种写法:
法一:
1. SELECT somecolumn FROM sometable WHERE DATE_ADD(xtime, INTERVAL
10 DAY) < NOW()
法二:
1. SELECT somecolumn FROM sometable WHERE DATE_SUB(NOW(),
INTERVAL 10 DAY) > xtime
两种写法执行结果等效但效率不同。如果xtime列建有索引,xtime 等效效率则法一的写法无法使用索引,而法二的写法可以用索引,使用可以索引故应采用第二种写法提高效率。
除此之外,SQL数据库优化还大有学问。
延迟输出与缓冲
有时候有些页面无论