常量)"/>
PHP学习笔记14(魔术常量)
PHP魔术常量
PHP中有很多预定义常量。目前所学习的这8个常量是会会随着它在代码中的位置而改变的常量。这些特殊常量均不区分大小写。
__LINE__
这个常量指的是脚本中当前行的行号。例如:
<?php
echo "这是第".__LINE__."行";
?>
注:如果在这些魔术常量上面加了引号的话,就会直接输出魔术常量的名字,而不是它所对应的值。
__FILE__
文件的完整路径和文件名。例如:
<?php
echo '该文件位于 " ' . __FILE__ . ' " ';
?>
在PHP4.02以后,该常量只会包含一个绝对路径。
__DIR__
文件的路径,但是只是到文件夹这一层,并不会包含文件名。用法和__FILE__一样。
__FUNCTION__
返回函数被定义时的名字。例如:
<?php
function test() {echo '函数名为:' . __FUNCTION__ ;
}
test();
?>
输出:函数名为test。(__METHOD__和它有相似的功能,__METHOD__返回的是方法被定义时的名字。)
__NAMESPACE__
返回当前命名空间的名称,该常量在编译时被定义。例如:
<?php
namespace MyProject;echo '命名空间为:"', __NAMESPACE__, '"'; // 输出 "MyProject"
?>
__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的方法。
更多推荐
PHP学习笔记14(魔术常量)
发布评论