php魔法函数
1. php SESSION用法 $_SESSION['']初始值
注意,在使用session之前一定要调用
<?php
session_start();
开始会话,否则会出错。在你的代码里我看不到。
$_SESSION数组的使用类似于普通数组。但它是有”魔法“的。当页面结束后,$_SESSION的内容会被PHP解析器自动保存下来,同时在用户的浏览器留下一个cookie。下次用户访问时,使用该cookie继续会话。
所以,检查一个session是否存在和普通数组一样:
<?php
//正确,检查flag下标是否设置
if(isset($_SESSION['flag']))...
//错误,会导致警告,下标不存在
if($_SESSION['flag'])...
//存储一个session值
$_SESSION['flag']=1;
//删除一个session值
unset($_SESSION['flag']);
一个没有设置的session是没有初始值的。就像你初始化一个空数组一样。
2. php做优化包括哪些内容
1:单引号代替双引号,双引号会去找变量。
2:方法定义为static,性能提升4倍。
3:$arr['id']的性能是$arr[id]的7倍。
4:echo性能快,尽量使用echo $a,$b,$c而非echo $a.$b.$c。
5:循环之前确定循环次数,尽量用foreach。
6:注销不使用的变量,节省内存。
7:尽量不使用魔法函数:__get、__set等。
8:require_once()会检查是否载入,消耗内存。
9:include文件时使用绝对路径,省去查找的时间。
10:脚本开始执行时间$_SERVER[‘REQUEST_TIME’]要好于time()。
11:正则效率低,用函数代替。
12:str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。
13:接收客串的效率比接收数组的效率高。
14:switch case好于多个if else。
15:用@屏蔽错误消息的方法很低效。
16:打开apache的mod_deflate模块,可以提高网页的浏览速度。
17:数据库连接当使用完毕时应关掉,不要用长连接。
18:错误消息代价昂贵。
19:在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度相当。
20:递增一个全局变量要比递增一个局部变量慢2倍。
21:递增一个对象属性(如:$this->prop++)要比递增一个局部变量慢3倍。
22:递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。
23:仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)。PHP大概会检查看是否存在全局变量。
24:方法调用看来与类中定义的方法的数量无关,因为我(在测试方法之前和之后都)添加了10个方法,但性能上没有变化。
25:派生类中的方法运行起来要快于在基类中定义的同样的方法。
26:调用带有一个参数的空函数,其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。
27:Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面,少用脚本。
28:尽量做缓存,可使用memcached。memcached是一款高性能的内存对象缓存系统,可用来加速动态Web应用程序,减轻数据库负载。对运算码 (OP code)的缓存很有用,使得脚本不必为每个请求做重新编译。
29:当操作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用strlen()函数。此函数执行起来相当快,因为它不做任何计算,只返回在zval 结构(C的内置数据结构,用于存储PHP变量)中存储的已知字符串长度。但是,由于strlen()是函数,多多少少会有些慢,因为函数调用会经过诸多步骤,如字母小写化(译注:指函数名小写化,PHP不区分函数名大小写)、哈希查找,会跟随被调用的函数一起执行。在某些情况下,你可以使用isset() 技巧加速执行你的代码。
30:当执行变量$i的递增或递减时,$i++会比++$i慢一些。这种差异是PHP特有的,并不适用于其他语言,所以请不要修改你的C或Java代码并指望它们能立即变快,没用的。++$i更快是因为它只需要3条指令(opcodes),$i++则需要4条指令。后置递增实际上会产生一个临时变量,这个临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理的一种,正如Zend的PHP优化器所作的那样。牢记这个优化处理不失为一个好主意,因为并不是所有的指令优化器都会做同样的优化处理,并且存在大量没有装配指令优化器的互联网服务提供商(ISPs)和服务器。
31:并不是事必面向对象(OOP),面向对象往往开销很大,每个方法和对象调用都会消耗很多内存。
32:尽量采用大量的PHP内置函数。
33:如果在代码中存在大量耗时的函数,你可以考虑用C扩展的方式实现它们。
34:mod_zip可作为Apache模块,用来即时压缩你的数据,并可让数据传输量降低80%。
35:在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情况下,尽量用 file_get_contents,因为他的效率高得多!但是要注意file_get_contents在打开一个URL文件时候的PHP版本问题。
36:尽量的少进行文件操作,虽然PHP的文件操作效率也不低的。
37:优化Select SQL语句,在可能的情况下尽量少的进行Insert、Update操作(在update上,我被恶批过)。
38:循环内部不要声明变量,尤其是大变量:对象。
39:多维数组尽量不要循环嵌套赋值。
40:在可以用PHP内部字符串操作函数的情况下,不要用正则表达式。
41:foreach效率更高,尽量用foreach代替while和for循环。
42:用i+=1代替i=i+1。符合c/c++的习惯,效率还高。
43:对global变量,应该用完就unset()掉。
3. 为什么说用PHP开发大型系统令人不爽
笔者在过去的四年里一直致力于PHP应用的开发 PHP确实十分容易编写 但是PHP也有一些十分严重的缺陷
下面笔者会给出自己的理由 为什么PHP不适合于比小型业余网站更大的网站
对递归的不良支持 递归是一种函数调用自身的机制 这是一种强大的特性可以把某些复杂的东西变得很简单 有一个使用递归的例子是快速排序(quicksort) 不幸的是 PHP并不擅长递归 Zeev 一个PHP开发人员 说道 PHP (Zend)对密集数据使用了栈方式 而不是使用堆方式 也就是说它能容忍的递归函数的数量限制和其他语言比起来明显少 见bug 这液亏烂是一个很不好的借口 每一个编程语言都应该提供良好的递归支持
许多PHP模块都不是线程安全的 在几年前 Apache发布了Web服务器的 版 这个版本支持多线程模式 在这个模式下 软件一个一部分可以同时运行多个 PHP的发明者说PHP的核心是线程安全的 但是非核心模块不一定是 但是十次有九次 你想要在PHP脚本中使用这种模块 但这又使你的脚本不能合适Apache的多线程模式 这也是为什么PHP小组不推荐在Apache 的多线程模式下运行PHP 不良的多线程模式支持使PHP常被认为是Apache 依然不流行的原因之一
请阅读这篇讨论 Slashdot: Sites Rejecting Apache ?
PHP 由于商业原因而不健全 通过使用缓存 PHP的性能可以陡增 %[见基准测试] 那么为什么缓存没有被构建在PHP中呢?因为Zend——PHP的制造者 它在销售自己的Zend Accelerator 所以当然 他们不想抛弃自己的商业产品这块肥肉
但是有另一个可选择空厅的 APC (Zend后来推出Zend Optimizer 免费的加速器——译者)
没有命名空间 设想某个人制作了一个PHP模块用来阅读文件 模块中一个函数叫做read 然后另一个人的模块可以读取网页的 同样包含一个函数read 然后我们就无法同时使用这两个模块了 因为PHP不知道你要用哪个函数
但是有一个很简单的解决方法 那就是命名空间 曾经有人建议PHP 加入这个特性 但不幸得是他没有这么做 现在 没有命名空间 每个函数都必须加上模块名作为前缀 来避免名称冲突 这导致了函数名恐怖得长 例如xsl_xsltprocessor_transform_to_xml让代码难于书写和理解
不标准的日期格式字符 很多程序员对 日期格式字符 都很熟悉 它是从UNIX和C语言中来的 其他一些编程语言采用了这个标准 但是很奇怪的 PHP有它自己的一套完全不兼容的日期格式字符 在C中 %j 表示一年中的当天 在PHP中他表示一个月中的当天 然而使事情更混乱的是 Smarty (一个很流行的PHP模版引擎)的 strftime 函数和 date_format 函数 却使用了C/UNIX的格式化字符
混乱的许可证 你也许认为PHP是免费的 所有的在手册中提到的PHP模块也是免费的 错了!例如 如果你想在PHP中生成PDF文件 你会在手册中发现两个模块 PDF 和 ClibPDF 但是这两个都是有商业许可证的 所以 你所使用的每个模块 你都要确保你同意他的许可证
不一致的函数命名规则 有些函数名称是有多个单词组成的 一般有三种单词组合的习惯
直接拼接 getnumberoffiles 用下划线分开 get_number_of_files 骆驼法则 getNumberOfFiles 大部分语言选择其中一中 但是PHP都用到了
例如 你想要把一些特殊字符转换成HTML实体 你会使用函闹漏数entities (直接拼接单词) 如果你要使用相反的功能 你要用到它的小弟弟_entity_decode 由于某些特殊的原因 这个函数名是由下划线分隔单词 怎么能这样呢?你知道有一个函数叫strpad 或者他是str_pad?每次你都要查看一下到底这个符号是什么或者直接等他出现一个错误 函数是不分大小写的 所以对于PHP来说rawurldecode 和RawUrlDecode之间没有什么区别 这也很糟糕 因为两个都使用到了同时他们看上去还不一样 混淆了阅读者
魔法引用的地狱 魔法引用(Magic quote)可以保护PHP脚本免受SQL注入攻击 这很好 但是出于某些原因 你可以在php ini中关闭这个配置 所以你如果要写出一个有弹性的脚本 你总要检查魔法引用是开启还是关闭 这样一个 特性 应该让编程更简单 而事实上变得更复杂了
缺少标准框架 一个成长中的网站没有一个整体框架 最终会变成维护的噩梦 一个框架可以让很多工作变得简单 现在最流行的框架模型时MVC 模型 在其中表现层 业务逻辑和数据库访问都分离开了
很多PHP网站不使用MVC 模型 他们甚至没有一个框架 甚至现在有一些PHP框架同时你都可以自己写一个 关于PHP的文章和手册没有提高框架的一个字 同时JSP 开发人员使用像Struts的框架 ASP开发人员使用 net 看起来好像这些概念都广泛被PHP开发人员所了解 这就说明了PHP实际上到底是多专业
总结什么问题?
对于非常小的项目 它可以是一个十分符合人意的编程语言 但是对于较大的和更为复杂的项目 PHP就显出他的薄弱了 当你不断地摸索之后 你会发现笔者提到的某些问题的解决方案 所以 当解决方案已知之后 为什么不能修正他呢?另外为什么这些修补不在手册中提到呢?
一个开源的语言十分流行是一件好事 但不幸得是 它不是一个伟大的语言 笔者希望所有的问题能有一天得到解决(也许在PHP ?) 然后我们就将拥有一个开源语言 他既开源 又好用
到现在 当你要启动一个多于 个脚本页面的项目的时候 你最好考虑C#/ASP NET 或者 Java/JSP或者也许Python同样是一个更好的选择
lishixin/Article/program/PHP/201311/21371