PHP常用的魔术常量

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的方法。

posted @ 2019-02-28 15:39  诸城布拉德皮特  阅读(197)  评论(0编辑  收藏  举报