批改状态:合格
老师批语:接口常量, 在配置异常处理器, 和一些系统参数中, 使用的非常多, 因为它比类常量要好用.只是目前大家还用不上而已
1、抽象类必须在class前面加关键abstract,且存在抽象方法(在function前面加abstract);
2、抽象类不能被实列化,只能通过子类来实现;子类实现时,必须实现父类中所有的抽象方法;
3、抽象方法中的访问权限,在子类中遵循访问权限必须大于等于父类(如果父类定义的抽象类为:protected时,子类必须时public);
4、抽象类中的抽象方法不能设置成私有的:private;
1、接口的关键字:interface;也无法实列化,
2、接口时纯粹的模板,只定义功能而不包含实现方法
3、接口中的成员的访问权限都是:public;
4、接口中的成员:方法和常量(接口中几乎很少使用);
5、接口实现:可以通过抽象类实现部分方法,但在继承的工作类中必须全部实现;
6、通过implements来继承接口;可以多继承以逗号分隔;
1、trait是一种特殊类的,无法实例化,只能通过宿主实现;像一个函数(方法)集合;
2、通过use来嵌入宿主;trait之间可以调用;也可以同时调用多个trait;use A,B;
3、不同trait中的同名方法可以通过替代insteadOf和as别名来区分使用;
4、trait中的方法可以通过as别名的方法来改变方法的访问权限;
1、abstract、interface、trait三者都不能被实例化;
2、抽象类单继承,接口可以多继承,trait可以工作中随时使用;
3、方法实现遵循的优先级:父类<trait<本身;
4、接口中全部为抽象方法;一般不适合写在接口和抽象类中方法和属性一般都写在trait;
1、代码
<?phpnamespace Test;class A{public static function getClass(){// 通过关键字static实现静态延迟绑定;static与调用类绑定return static::class;}public static function getC(){// self代表当前类,与定义它的当前类绑定return self::class;}}class B extends A{}echo B::getC();echo '<br>';echo A::getC();echo '<hr>';echo "静态延迟绑定",'<br>';echo B::getClass();echo '<br>';echo A::getClass();namespace Test1;class A{public static function getClass(){// 通过关键字static实现静态延迟绑定;static与调用类绑定return '当前的调用的是'.__METHOD__;}public static function getC(){// self代表当前类,与定义它的当前类绑定return static::getClass();}}class B extends A{public static function getClass(){// 通过关键字static实现静态延迟绑定;static与调用类绑定return '重写后,当前的调用的是'.__METHOD__;}}echo '<hr>';echo "静态方法重写",'<br>';echo B::getC();echo '<br>';echo A::getC();echo '<hr>';class Php{public $name;protected $city;private $age=30;// private $sex;public function __construct($name,$city){$this->name=$name;$this->city=$city;}public function write(){return $this->name."在".$this->city;}// 访问属性属性查询拦截器public function __get($name){return $this->$name??'没有'.$name.'属性';}public function __set($name, $value){return $this->$name=$value;}public function __isset($protect){return (isset($this->$protect)) ? true : false;}public function __unset($protect){return (isset($this->$protect)) ? $this->$protect=null : '无此值';}public function __call($name, $arguments){printf('方法名:%s,参数有:%s',$name,implode(',',$arguments));}public function __callStatic($name, $arguments){printf('方法名:%s,参数有:%s',$name,implode(',',$arguments));}}echo (new Php('ldy','郑州'))->write();echo '<br>',"<h3>访问属性拦截器:</h3>",'<br>';echo (new Php('ldy','河南'))->age;echo '<br>';echo (new Php('ldy','河南'))->a;echo '<br>',"<h3>设置属性拦截器:</h3>",'<br>';$obj=new Php('ldy','ly');$obj->city='洛阳';echo $obj->write();echo '<h3>属性检测</h3>','<hr>';echo isset($obj->age)? '有此值':'无此值';echo '^^^^';echo isset($obj->aggggg)? '有此值':'无此值';echo '<h3>属性销毁</h3><hr>';echo $obj->age,'<br>';unset($obj->age);echo $obj->age;echo "<hr><h3>方法拦截器</h3>";echo $obj->get(1,2,3);echo "<hr><h3>静态方法拦截器</h3>";echo $obj::get(1,2,3);
2、演示结果
1、静态方法调用:self::,parent::,static::; 其中只有static::与调用类绑定;
2、静态方法调用时;如果不static关键字静态绑定的,是子类重写静态方法的是无效的;
3、构造器:__construct();析构器:__destruct();
4、属性拦截器:
* __get( $property ) 访问未定义的属性时候被调用* __set( $property, $value) 给未定义的属性赋值时被调用* __isset( $property ) 给未定义的属性调用isset()时候被调用* __unset( $property ) 给未定义的属性调用unset()的时候被调用
5、方法拦截器:
* __call( $method, $arg_array ) 调用未定义的方法时候被调用* __callStatic( $method, $arg_array ) 调用未定义的静态方法时候被调用
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号