php知识点
一、typeof
// 运算数为数字 typeof(x) = "number" // 运算数为字符串 typeof(x) = "string" // 运算数为布尔值 typeof(x) = "boolean" // 运算数为对象,数组和null typeof(x) = "object" // 运算数为函数 typeof(x) = "function"
二、PHP 的“魔术常量”
PHP 向它运行的任何脚本提供了大量的预定义常量。不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。
有七个魔术常量它们的值随着它们在代码中的位置改变而改变。
_LINE__ 文件中的当前行号。 __FILE__ 文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径(如果是符号连接,则是解析后的绝对路径),而在此之前的版本有时会包含一个相对路径。 __DIR__ 文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。它等价于 dirname(__FILE__)。除非是根目录,否则目录中名不包括末尾的斜杠。(PHP 5.3.0中新增) = __FUNCTION__ 函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。 __CLASS__ 类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。 __METHOD__ 类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。 __NAMESPACE__ 当前命名空间的名称(大小写敏感)。这个常量是在编译时定义的(PHP 5.3.0 新增)
例子 class trick { function doit() { echo __FUNCTION__; } function doitagain() { echo __METHOD__; } } $obj=new trick(); $obj->doit(); output will be ---- doit $obj->doitagain(); output will be ----- trick::doitagain
三、PHP的魔术方法:
PHP把类中所有以__(两个下划线)开头的方法当成魔术方法,一般建议用户不要将自定义的方法前面加上__作为前缀。魔术方法: 1. __construct() 类的默认构造方法,如果__construct()和与类同名的方法共同出现时,默认调用__construct()而不是同类名方法。一般情况下用户自定义构造方法也会使用__construct()。 2. __destruct() 类的析构函数,当该对象的所有引用都被删除,或者对象被显式销毁时执行。 3. __get($name) 可以简单归纳为:用$object->a的方式读取对象的属性时,如果属性a存在且是public型,那么直接返回该属性的值;如果属性a不存在或者是protected/private这样的不可直接访问的类型,就会调用__get($name)方法并以返回值为准。一般可以使用该方法使外部可限制性地访问内部属性,或者完成类似java中的反射操作。 4. __set($name, $value) 与__get($name)类似,用$object->a = 17的方式给属性赋值时,如果属性a存在且是public型,那么直接给属性a赋值皆可;如果属性a不存在或者是protected/private型,就会调用__set($name, $value)方法。 5. __call($name, $arguments) / __callStatic($name, $arguments) 当调用不存在或者不可访问的方法时,会调用__call($name, $arguments)方法。而当在静态方法中调用不存在或者不可访问的方法时,会调用__callStatic($name, $arguments)方法。 对象调用某个方法,若方法存在,则直接调用;若不存在,则会去调用__call函数。 6. __toString() 当打印对象时会被直接调用。如echo $object; 7. __clone() 当对象被拷贝时直接调用。如$a = new Action(); $a = $object; 如:$t=new Test();$t1=clone $t; 8. __isset($name) / __unset($name) 对不存在或者不可访问的属性使用isset()或者empty()时,__isset()会被调用;当unset一个不存在或者不可访问的属性时,__unset()会被调用,否则直接unset该属性皆可。 9. __set_state() 用var_export()输出一个对象时,__set_state()会被调用,输出内容以该魔术方法的返回值为准。注:var_export()和var_dump()类似,只是var_export()输出的内容符合php语法。注意使用方法: $test = new Test(); $b = var_export($test, true); var_dump($b); class Test { public $a; public static function __set_state($array) { $ab = new Test(); $ab->a = 10; return $ab; } } 10. __autoload($name) 实例化一个对象时,如果对应的类不存在,则该方法被调用。注意:该方法是全局函数,参数是类的名称。 11. __sleep() / __wakup() __sleep():serialize之前被调用。若对象比较大,想删减一点东东再序列化,可考虑一下此函数。 __wakup():unserialize时被调用,做些对象的初始化工作。
四、PHP环境变量
PHP环境变量主要有 $GLOBALS[]、$_SERVER[]、$_GET[]、$_POST[]、$_COOKIE[]、$_FILES[]、$_ENV[]、$_REQUEST[]、$_SESSION[]。 $_GET和$_POST主要针对FORM表单提交的数据, $_COOKIE和$_SESSION主要针对客户端游览器和服务器端会话数据。 $_FILES主要针对文件上传时提交的数据, $_REQUEST主要针对提交表单中所有请求数组,包括$_GET、$_POST、$_COOKIE中的所有内容
PHP环境变量$_SERVER 是一个包含服务器端相关信息的PHP全局环境变量,在PHP4.1.0之前的版本使用$HTTP_SERVER_VARS。更多信息可以参考这里。 $_SERVER['PHP_SELF'] 当前正在执行脚本的文件名,与 document root相关。在FORM表单中,如执行文件是本身,你可以在ACTION中使用$_SERVER['PHP_SELF'],好处是当执行文件名有变动时可以不去频繁替换ACTION中的文件名。 $_SERVER['SERVER_NAME'] 当前运行的PHP程序所在服务器主机的名称。 $_SERVER['REQUEST_METHOD'] 访问页面时的请求方法,即GET、HEAD、POST、PUT。 $_SERVER['DOCUMENT_ROOT'] 当前运行的PHP程序所在的文档根目录。也就是PHP.INI文件中的定义。 $_SERVER['HTTP_REFERER'] 链接到当前页面的前一页面的URL地址。在页面跳转功能中非常有用。 $_SERVER['REMOTE_ADDR'] 正在浏览当前页面访问者的IP地址。 $_SERVER['REMOTE_HOST'] 正在浏览当前页面用户的主机名。 $_SERVER['REMOTE_PORT'] 正在游览的用户连接到服务器时所使用的端口。 $_SERVER['SCRIPT_FILENAME'] 当前执行脚本的绝对路径名。 $_SERVER['SERVER_PORT'] 服务器所使用的端口 $_SERVER['SCRIPT_NAME'] 包含当前脚本的路径。这在页面需要指向自己时非常有用。 $_SERVER['REQUEST_URI'] 访问此页面所需的URI。如“/index.html”。 $_SERVER['PHP_AUTH_USER'] 应用在HTTP用户登录认证功能中,这个变量是用户输入的用户名。 $_SERVER['PHP_AUTH_PW'] 应用在HTTP用户登录认证功能中,这个变量便是用户输入的密码。 $_SERVER['AUTH_TYPE'] 应用在HTTP用户登录认证功能中,这个变量便是认证的类型。 注:上述提到的这些PHP全局环境变量,在php.ini中的register_globals设置为on时,这些变量在所有PHP程序脚本中都可用,也就是$_SERVER数组被分离了。当然为了安全考虑,还是不要将register_globals打开为好。
PHP系统常量 __FILE__ 当前PHP程序脚本的绝对路径及文件名称 __LINE__ 存储该常量所在的行号 __FUNCTION__ 存储该常量所在的函数名称 __CLASS__ 存储该常量所在的类的名称 PHP_VERSION 存储当前PHP的版本号,也可以通过PHPVERSION()函数获取。 PHP_OS 存储当前服务器的操作系统
五、环境变量
$ip = getenv('REMOTE_ADDR'); // 或简单仅使用全局变量($_SERVER 或 $_ENV) $ip = $_SERVER['REMOTE_ADDR'];
PHP中的$_ENV是一个包含服务器端环境变量的数组。它是PHP中一个超级全局变量,我们可以在PHP 程序的任何地方直接访问它。$_ENV只是被动的接受服务器端的环境变量并把它们转换为数组元素。
由于$_ENV变量是取决于服务器的环境变量的,从不同的服务器上获取的$_ENV变量打印出的结果可能是完全不同的。所以无法像$_SERVER 那样列出完整的列表。
有时候,$_ENV会为空,其原因通常是php的配置文件php.ini的配置项为:variables_order = "GPCS"。要想让$_ENV的值不为空,那么variables_order的值应该加上一个大写字母“E”,即:variables_order = "EGPCS"。
上述配置表示了PHP接受的外部变量来源及顺序,EGPCS是Environment、Get、Post、Cookies、Server的缩写。如果variables_order 的配置中缺少E ,则PHP 无法接受环境变量,那么$_ENV 也就为空了。
由于开启$_ENV,即variables_order = "EGPCS"会导致一些性能损失,按php官方的说法是,在生产环境中,不推荐使用。
他们更推荐使用getenv (string $varname)函数来获取Environment中的值,而这点需要在编程时就注意到。如果编程时用了$_ENV而variables_order中又没有配置为variables_order = "EGPCS",则程序运行时可能会报错。
$_SERVER与$_ENV变量列表
_SERVER["SCRIPT_NAME"] /php/index.php _SERVER["HTTP_COOKIE"] cdb_sid=tcSZ7o _SERVER["AUTH_PASSWORD"] no value _SERVER["AUTH_TYPE"] no value _SERVER["AUTH_USER"] no value _SERVER["CONTENT_LENGTH"] 0 _SERVER["CONTENT_TYPE"] no value _SERVER["PATH_TRANSLATED"] c:\inetpub\wwwroot _SERVER["QUERY_STRING"] (url中问号后边的部分) _SERVER["REMOTE_ADDR"] 127.0.0.1 _SERVER["REMOTE_HOST"] 127.0.0.1 _SERVER["REMOTE_USER"] no value _SERVER["REQUEST_METHOD"] GET _SERVER["SERVER_NAME"] localhost _SERVER["SERVER_PORT"] 80 _SERVER["SERVER_PROTOCOL"] HTTP/1.1 _SERVER["SERVER_SOFTWARE"] Microsoft-IIS/6.0 _SERVER["APPL_MD_PATH"] /LM/W3SVC/1/Root/php _SERVER["APPL_PHYSICAL_PATH"] E:\web\php\ _SERVER["INSTANCE_ID"] 1 _SERVER["INSTANCE_META_PATH"] /LM/W3SVC/1 _SERVER["LOGON_USER"] no value _SERVER["REQUEST_URI"] /php/index.php _SERVER["URL"] /php/index.php _SERVER["SCRIPT_FILENAME"] E:\web\php\index.php _SERVER["ORIG_PATH_INFO"] /php/index.php _SERVER["PATH_INFO"] no value _SERVER["ORIG_PATH_TRANSLATED"] E:\web\php\index.php _SERVER["DOCUMENT_ROOT"] c:\inetpub\wwwroot _SERVER["PHP_SELF"] /php/index.php _SERVER["HTTP_CONNECTION"] keep-alive _SERVER["HTTP_KEEP_ALIVE"] 300 _SERVER["HTTP_HOST"] localhost _SERVER["HTTP_USER_AGENT"] Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2 _SERVER["REQUEST_TIME"] 1146214357 _SERVER["argv"] Array ( ) _SERVER["argc"] 0 _ENV["ALLUSERSPROFILE"] C:\Documents and Settings\All Users _ENV["ClusterLog"] C:\WINDOWS\Cluster\cluster.log _ENV["CommonProgramFiles"] C:\Program Files\Common Files _ENV["COMPUTERNAME"] LIUBO _ENV["ComSpec"] C:\WINDOWS\system32\cmd.exe _ENV["FP_NO_HOST_CHECK"] NO _ENV["NUMBER_OF_PROCESSORS"] 1 _ENV["OS"] Windows_NT _ENV["Path"] C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;E:\Program Files\MySQL\MySQL Server 5.0\bin;c:\php;c:\php\ext _ENV["PATHEXT"] .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH _ENV["PROCESSOR_ARCHITECTURE"] x86 _ENV["PROCESSOR_IDENTIFIER"] x86 Family 15 Model 4 Stepping 1, GenuineIntel _ENV["PROCESSOR_LEVEL"] 15 _ENV["PROCESSOR_REVISION"] 0401 _ENV["ProgramFiles"] C:\Program Files _ENV["SystemDrive"] C: _ENV["SystemRoot"] C:\WINDOWS _ENV["TEMP"] d:\ _ENV["TMP"] d:\ _ENV["USERPROFILE"] C:\Documents and Settings\Default User _ENV["windir"] C:\WINDOWS