一、typeof
// 运算数为数字typeof(x) = "number"// 运算数为字符串typeof(x) = "string"// 运算数为布尔值typeof(x) = "boolean"// 运算数为对象,数组和nulltypeof(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