背景
最近在看laravel框架的源码,不知道Route是怎么定义的,找了很久都没找到,遂从网上找有什么方法可以根据类名获得类的命名空间什么的,最后找到了用get_class_methods获得Route类定义的相关方法名称,然后根据这些方法名称组合找到类的定义(Illuminate\Support\Facades\Facade),下面是在寻找方法过程中学到的知识。
类相关魔术常量
<?php
namespace sakurallj;
trait traitTest {
function getReturnType() { echo "__TRAIT__:".__TRAIT__.PHP_EOL; }
}
class TestController
{
use \sakurallj\traitTest;
public function test()
{
echo "__LINE__:".__LINE__.PHP_EOL
."__FILE__:".__FILE__.PHP_EOL
."__FUNCTION__:".__FUNCTION__.PHP_EOL
."__CLASS__:".__CLASS__.PHP_EOL
."__METHOD__:".__METHOD__.PHP_EOL
."__NAMESPACE__:".__NAMESPACE__.PHP_EOL;
}
}
$t = new \sakurallj\TestController();
$t->test();
$t->getReturnType();
//output:
__LINE__:16
__FILE__:/home/sakurallj/personDoc/phpWorkspace/index.php
__FUNCTION__:test
__CLASS__:sakurallj\TestController
__METHOD__:sakurallj\TestController::test
__NAMESPACE__:sakurallj
__TRAIT__:sakurallj\traitTest
?>
获取类名、方法名、变量名的方法
get_class(object); //取得对象的类名
get_class_methods(class name); //取得class name 类的所有的方法名,并且组成一个数组
get_class_vars(class name); //取得class name 类的所有的变亮名,并组成一个数组
class Test
{
private $a;
protected $b;
public $c;
const d = 0;
private function foo()
{
}
protected function foo1()
{
}
public function name()
{
echo "My name is " , get_class($this) , "\n";
}
}
$bar = new Test();
// external call
echo "Its name is " , get_class($bar) , "\n";
// internal call
$bar->name();
var_dump(get_class_methods("Test"));//只能获得public的方法
var_dump(get_class_vars("Test"));//只能获得public的变量,不能获得const定义的变量
//output:
Its name is Test
My name is Test
array(2) {
[0] =>
string(4) "name"
[1] =>
string(5) "name1"
}
array(1) {
'c' =>
NULL
}
参考
http://php.net/manual/zh/language.constants.predefined.php
http://www.php.net/manual/zh/function.get-class.php