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、代码
<?php
namespace 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 ) 调用未定义的静态方法时候被调用