当前位置:Gxlcms > PHP教程 > PHP面向对象中的重要知识点(三)_PHP教程

PHP面向对象中的重要知识点(三)_PHP教程

时间:2021-07-01 10:21:17 帮助过:5人阅读

1. namespace: 和C++中的名字空间很像,作用也一样,都是为了避免在引用较多第三方库时而带来的名字冲突问题。通过名字空间,即便两个class的名称相同,但是因为位于不同的名字空间内,他们仍然可以被精确定位和区分。第一次看到PHP的名字空间语法时,感觉和C++相比在语法上是非常非常相似的,然而在写点儿小例子做做实验的时候才发现,他们的差别还是很大的,为了避免以后忘记,所以这里特别将其记录了下来。见如下代码: getName(); if ($c->isUserDefined()) { $details .= "$name is user defined.\n"; } if ($c->isInternal()) { $details .= "$name is built-in.\n"; } if ($c->isAbstract()) { $details .= "$name is abstract class.\n"; } if ($c->isFinal()) { $details .= "$name is final class.\n"; } if ($c->isInstantiable()) { $details .= "$name can be instantiated.\n"; } else { $details .= "$name cannot be instantiated.\n"; } return $details; } function classSource(ReflectionClass $c) { $path = $c->getFileName(); $lines = @file($path); //获取类定义代码的起始行和截至行。 $from = $c->getStartLine(); $to = $c->getEndLine(); $len = $to - $from + 1; return implode(array_slice($lines,$from - 1,$len)); } print "The following is Class Information.\n"; print classInfo(new ReflectionClass('TestClass')); print "\nThe following is Class Source.\n"; print classSource(new ReflectionClass('TestClass')); 运行结果如下: bogon:TestPhp$ php reflection_test.php The following is Class Information. TestClass is user defined. TestClass can be instantiated. The following is Class Source. class TestClass { public $publicVariable; function publicMethod() { print "This is publicMethod.\n"; } } 下面让我们仍然以代码示例和关键性注释的方法继续ReflectionMethod的学习之旅。 getName(); $details = ""; if ($m->isUserDefined()) { $details .= "$name is user defined.\n"; } if ($m->isInternal()) { $details .= "$name is built-in.\n"; } if ($m->isAbstract()) { $details .= "$name is abstract.\n"; } if ($m->isPublic()) { $details .= "$name is public.\n"; } if ($m->isProtected()) { $details .= "$name is protected.\n"; } if ($m->isPrivate()) { $details .= "$name is private.\n"; } if ($m->isStatic()) { $details .= "$name is static.\n"; } if ($m->isFinal()) { $details .= "$name is final.\n"; } if ($m->isConstructor()) { $details .= "$name is constructor.\n"; } if ($m->returnsReference()) { $details .= "$name returns a reference.\n"; } return $details; } function methodSource(ReflectionMethod $m) { $path = $m->getFileName(); $lines = @file($path); $from = $m->getStartLine(); $to = $m->getEndLine(); $len = $to - $from + 1; return implode(array_slice($lines, $from - 1, $len)); } $rc = new ReflectionClass('TestClass'); $methods = $rc->getMethods(); print "The following is method information.\n"; foreach ($methods as $method) { print methodInfo($method); print "\n--------------------\n"; } print "The following is Method[TestClass::publicMethod] source.\n"; print methodSource($rc->getMethod('publicMethod')); 运行结果如下: bogon:TestPhp$ php reflection_test.php The following is method information. __construct is user defined. __construct is public. __construct is constructor. -------------------- privateMethod is user defined. privateMethod is private. -------------------- publicMethod is user defined. publicMethod is public. -------------------- publicMethod2 is user defined. publicMethod2 is public. -------------------- The following is Method[TestClass::publicMethod] source. function publicMethod() { print "This is publicMethod.\n"; } 让我们继续ReflectionParameter吧,他表示的是成员函数的参数信息。继续看代码吧。 getDeclaringClass(); $name = $p->getName(); $class = $p->getClass(); $position = $p->getPosition(); $details .= "\$$name has position $position.\n"; if (!empty($class)) { $classname = $class->getName(); $details .= "\$$name must be a $classname object\n"; } if ($p->isPassedByReference()) { $details .= "\$$name is passed by reference.\n"; } if ($p->isDefaultValueAvailable()) { $def = $p->getDefaultValue(); $details .= "\$$name has default: $def\n"; } return $details; } $rc = new ReflectionClass('TestClass'); $method = $rc->getMethod('publicMethod2'); $params = $method->getParameters(); foreach ($params as $p) { print paramInfo($p)."\n"; } 运行结果如下: bogon:TestPhp$ php reflection_test.php $arg1 has position 0. $arg1 must be a ParamClass object $arg2 has position 1. $arg2 is passed by reference. $arg3 has position 2. $arg3 has default: 上面介绍的都是通过PHP提供的Reflection API来遍历任意class的具体信息,事实上和Java等其他语言提供的反射功能一样,PHP也同样支持通过反射类调用实际对象的方法,这里将主要应用到两个方法,分别是ReflectionClass::newInstance()来创建对象实例,另一个是ReflectionMethod::invoke(),根据对象实例和方法名执行该方法。见如下代码: privateArg = $arg; } function publicMethod() { print '$privateArg = '.$this->privateArg."\n"; } function publicMethod2($arg1, $arg2) { print '$arg1 = '.$arg1.' $arg2 = '.$arg2."\n"; } } $rc = new ReflectionClass('TestClass'); $testObj = $rc->newInstanceArgs(array('This is private argument.')); $method = $rc->getMethod('publicMethod'); $method->invoke($testObj); $method2 = $rc->getMethod('publicMethod2'); $method2->invoke($testObj,"hello","world"); 运行结果如下: bogon:TestPhp$ php reflection_test.php $privateArg = This is private argument. $arg1 = hello $arg2 = world 事实上ReflectionClass、ReflectionMethod和ReflectionParameter提供给我们的可用方法还有更多,这里只是给出几个最典型的方法,以便我们可以更为直观的学习和了解PHP Reflection API。相信再看完以后的代码示例之后,我们都会比较清楚,如果今后需要用到和class相关的功能,就从ReflectionClass中查找,而member function的信息则一定来自于ReflectionMethod,方法参数信息来自于ReflectionParameter。 注:该Blog中记录的知识点,是在我学习PHP的过程中,遇到的一些PHP和其他面向对象语言相比比较独特的地方,或者是对我本人而言确实需要簿记下来以备后查的知识点。虽然谈不上什么深度,但是还是希望能与大家分享。

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/664271.htmlTechArticle1. namespace: 和C++中的名字空间很像,作用也一样,都是为了避免在引用较多第三方库时而带来的名字冲突问题。通过名字空间,即便两个cl...

人气教程排行