1. interface_exists、class_exists、method_exists和property_exists:php
顾名思义,从以上几个函数的命名即可以猜出几分他们的功能。我想这也是我随着对PHP的深刻学习而愈来愈喜欢这门编程语言的缘由了吧。下面先给出他们的原型声明和简短说明,更多的仍是直接看例子代码吧。
bool interface_exists (string $interface_name [, bool $autoload = true ]) 判断接口是否存在,第二个参数表示在查找时是否执行__autoload。
bool class_exists (string $class_name [, bool $autoload = true ]) 判断类是否存在,第二个参数表示在查找时是否执行__autoload。
bool method_exists (mixed $object , string $method_name) 判断指定类或者对象中是否含有指定的成员函数。
bool property_exists (mixed $class , string $property) 判断指定类或者对象中是否含有指定的成员变量。编程
<?php //in another_test_class.php interface AnotherTestInterface { } class AnotherTestClass { public static function printMe() { print "This is Test2::printSelf.\n"; } public function doSomething() { print "This is Test2::doSomething.\n"; } public function doSomethingWithArgs($arg1, $arg2) { print 'This is Test2::doSomethingWithArgs with ($arg1 = '.$arg1.' and $arg2 = '.$arg2.").\n"; } } <?php //in class_exist_test.php, 下面测试代码中所需的类和接口位于another_test_class.php, //由此能够发现规律,类和接口的名称是驼峰风格的,而文件名的单词间是下划线分隔的。 //这里给出了两种__autoload的方式,由于第一种更为经常使用和方便,所以咱们这里将第二种方式注释掉了,他们之间的差异能够查看manual。 function __autoload($classname) { $nomilizedClassname = strtolower(preg_replace('/([A-Z]\w*)([A-Z]\w*)([A-Z]\w*)/','${1}_${2}_${3}',$classname)); require strtolower($nomilizedClassname).".php"; } //spl_autoload_register(function($classname) { // $nomilizedClassname = strtolower(preg_replace('/([A-Z]\w*)([A-Z]\w*)([A-Z]\w*)/','${1}_${2}_${3}',$classname)); // require strtolower($nomilizedClassname).".php"; //}); print "The following case is tested before executing autoload.\n"; if (!class_exists('AnotherTestClass',false)) { print "This class doesn't exist if no autoload.\n"; } if (!interface_exists('AnotherTestInterface',false)) { print "This interface doesn't exist if no autoload.\n"; } print "\nThe following case is tested after executing autoload.\n"; if (class_exists('AnotherTestClass',true)) { print "This class exists if autoload is set to true.\n"; } if (interface_exists('AnotherTestInterface',true)) { print "This interface exists if autoload is set to true.\n"; }
运行结果以下: 数组
bogon:TestPhp$ php class_exist_test.php The following case is tested before executing autoload. This class doesn't exist if no autoload. This interface doesn't exist if no autoload. The following case is tested after executing autoload. This class exists if autoload is set to true. This interface exists if autoload is set to true.
2. get_declared_classes和get_declared_interfaces: 编程语言
分别返回当前能够访问的全部类和接口,这不只包括自定义类和接口,也包括了PHP内置类和接口。他们的函数声明很是简单,没有参数,只是返回数组。见以下代码:函数
<?php interface AnotherTestInterface { } class AnotherTestClass { public static function printMe() { print "This is Test2::printSelf.\n"; } } print_r(get_declared_interfaces()); print_r(get_declared_classes());
因为输出结果过长,并且这两个函数也比较简单,因此下面就再也不给出输出结果了。学习
3. get_class_methods、get_class_vars和get_object_vars: 测试
这三个函数有一个共同点,即只能获取做用域可见范围内的全部成员函数、成员变量或非静态成员变量。好比在类的内部调用,则全部成员函数或者变量都符合条件,而在类的外部,则只有共有的函数和变量能够返回。
array get_class_methods (mixed $class_name) 获取指定类中可访问的成员函数。
array get_class_vars (string $class_name) 获取指定类中能够访问的成员变量。
array get_object_vars (object $object) 获取能够访问的非静态成员变量。ui
<?php function output_array($functionName, $items) { print "$functionName.....................\n"; foreach ($items as $key => $value) { print '$key = '.$key. ' => $value = '.$value."\n"; } } class TestClass { public $publicVar = 1; private $privateVar = 2; static private $staticPrivateVar = "hello"; static public $staticPublicVar; private function privateFunction() { } function publicFunction() { output_array("get_class_methods",get_class_methods(__CLASS__)); output_array('get_class_vars',get_class_vars(__CLASS__)); output_array('get_object_vars',get_object_vars($this)); } } $testObj = new TestClass(); print "The following is output within TestClass.\n"; $testObj->publicFunction(); print "\nThe following is output out of TestClass.\n"; output_array('get_class_methods',get_class_methods('TestClass')); output_array('get_class_vars',get_class_vars('TestClass')); output_array('get_object_vars',get_object_vars($testObj));
运行结果以下:this
bogon:TestPhp liulei$ php class_exist_test.php The following is output within TestClass. get_class_methods..................... $key = 0 => $value = privateFunction $key = 1 => $value = publicFunction get_class_vars..................... $key = publicVar => $value = 1 $key = privateVar => $value = 2 $key = staticPrivateVar => $value = hello $key = staticPublicVar => $value = get_object_vars..................... $key = publicVar => $value = 1 $key = privateVar => $value = 2 The following is output out of TestClass. get_class_methods..................... $key = 0 => $value = publicFunction get_class_vars..................... $key = publicVar => $value = 1 $key = staticPublicVar => $value = get_object_vars..................... $key = publicVar => $value = 1
4. get_called_class和get_class:spa
string get_class ([ object $object = NULL ]) 获取参数对象的类名称。
string get_called_class (void) 静态方法调用时当前的类名称。
<?php class Base { static public function test() { var_dump(get_called_class()); } } class Derive extends Base { } Base::test(); Derive::test(); var_dump(get_class(new Base())); var_dump(get_class(new Derive()));
运行结果以下:
bogon:TestPhp$ php another_test_class.php string(4) "Base" string(6) "Derive" string(4) "Base" string(6) "Derive"
5. get_parent_class、is_a和is_subclass_of:
这三个函数都是和类的继承相关,因此我把他们归到了一块儿。
string get_parent_class ([ mixed $object ]) 获取参数对象的父类,若是没有父类则返回false。
bool is_a (object $object, string $class_name) 判断第一个参数对象是不是$class_name类自己或是其父类的对象。
bool is_subclass_of (mixed $object, string $class_name) 判断第一个参数对象是不是$class_name的子类。
<?php class Base { static public function test() { var_dump(get_called_class()); } } class Derive extends Base { } var_dump(get_parent_class(new Derive())); var_dump(is_a(new Derive(),'Derive')); var_dump(is_a(new Derive(),'Base')); var_dump(is_a(new Base(),'Derive')); var_dump(is_subclass_of(new Derive(),'Derive')); var_dump(is_subclass_of(new Derive(),'Base'));
运行结果以下:
bogon:TestPhp$ php another_test_class.php string(4) "Base" bool(true) bool(true) bool(false) bool(false) bool(true)