魔术变量

魔术常量 作用
LINE 文件当前行号
FILE 文件完整路径和文件名
DIR 文件所在的目录
FUNCTION 所在函数名称
CLASS 所在类的名称
TRAIT trait的名字
METHOD 所在方法
NAMESPACE 所在命名空间的名称

命名空间

namespace定义命名空间必须是在第一行,即命名空间必须在其他所有代码之前

<?php //这里必须是第一行
namespace myTest;
?>

以下列方式命名多个命名空间

<?php
namespace MyProject {

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }
}

namespace { // 全局代码
session_start();
$a = MyProject\connect();
echo MyProject\Connection::start();
}
?>

在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前。

declare(encoding='UTF-8'); //定义多个命名空间和不包含在命名空间中的代码
namespace MyProject;

面向对象

<?php
abstract class fruits{
    const ft="水果";//定义常量
    protected $name;
    public static $amount;//定义静态变量
    abstract protected function buying();//定义抽象方法
    function __construct(){
        self::$amount=6;//静态变量内部调用方法
    }//定义构造方法
    function eaten(){
        self::$amount++;
        echo self::$amount."<br>";
    }//定义方法
    function __destruct(){
        echo "fruits被销毁"."<br>";
    }//定义析构函数
}
final class apple extends fruits{//定义了final的类不能被别的类继承
    function __construct(){
        self::$amount=6;//静态变量内部调用方法
    }//定义构造方法
    protected function buying(){
        return "I buy an apple";//抽象方法实例化的访问控制应该和父类的定义是一样的
        //像父类用protected,这里也需要用protected
    }
    function eaten(){
        parent::eaten();//调用父类的方法
        echo "我吃了一个苹果"."<br>";
    }
}
$apple=new apple();
echo $apple::$amount."<br>";
echo apple::$amount."<br>";//成员变量和常量可以用类名访问,也可以用对象访问
echo $apple::ft."<br>";
echo apple::ft."<br>";//常量调用不需要使用$
echo $apple->eaten();//调用成员方法
//当对象结束其生命周期的时候,自动调用析构函数
?>