PHP魔术常量(注:如果在这些魔术常量上面加了引号的话,就会直接输出魔术常量的名字,而不是它所对应的值。)
1、__LINE__
脚本中当前行的行号。例如:
<?php echo "这是第".__LINE__."行"; ?>
2、__FILE__
文件的完整路径和文件名。例如:
<?php echo '该文件位于 " ' . __FILE__ . ' " '; ?>
(在PHP4.02以后,该常量只会包含一个绝对路径。)
3、__DIR__
文件的路径,但是只是到文件夹这一层,并不会包含文件名。用法和__FILE__一样。
4、__FUNCTION__
返回函数被定义时的名字。例如:
<?php function test() { echo '函数名为:' . __FUNCTION__ ; } test(); ?>
输出:函数名为test。(__METHOD__和它有相似的功能,__METHOD__返回的是方法被定义时的名字。)
5、__NAMESPACE__
返回当前命名空间的名称,该常量在编译时被定义。例如:
<?php namespace MyProject; echo '命名空间为:"', __NAMESPACE__, '"'; // 输出 "MyProject" ?>
6、__TRAIT__
该魔术常量可以理解成一种虚拟的多继承方式(PHP中只有单继承的概念)。用法:
trait testa{ function mytesta(){ echo 'this is a test'; } } trait testb{ function mytestb(){ echo 'this is another test'; } }
可以看到,除了关键字不同,trait的用法和声明一个类是一样的。(为了体现trait的用法,此处使用两个trait)。现在有一个类,要同时继承testa和testb两个方法。可以这样定义:
class myclass{ use testa,testb; }
注:在类中进行“多继承”的时候,多个trait要用逗号隔开。通过这种方法,当新声明一个变量时,他就可以使用这两个类的方法了。
$a=new myclass(); $a->mytesta(); $a->mymestb(); //这样做是可以的。
如果上面两个trait的方法重名了(例如两个trait全部使用了名为mytest的方法),这将会引起冲突。可以在定义myclass类的use testa,testb代码后面加一组花括号:
class myclass{ use testa,testb{ testa::mytest insteadof testb; testb::mytest as mytestb; } }
有两种方法来化解冲突:一种就是用testa里面的mytest方法来代替testb里面的同名方法。第二种就是用as的方式为testb里面的重名方法改一个名字。
注:1.一般情况下,trait中只有方法,没有属性。单继承的方式更适合属性。
2.trait不能实例化,也就是说,不能使用new的方式来让一个trait实例化。
3.trait中的方法要想让使用trait的类使用的话,该方法必须是public。
4.trait中可以嵌套trait。也就是说,一个trait中可以使用use的方法来嵌套另外一个trait。如果后面有类来使用这个trait的话,这个类可以获得两个trait中的所有为public的方法。