
批改狀態(tài):合格
老師批語:接口常量, 在配置異常處理器, 和一些系統(tǒng)參數(shù)中, 使用的非常多, 因為它比類常量要好用.只是目前大家還用不上而已
1、抽象類必須在class前面加關(guān)鍵abstract
,且存在抽象方法(在function前面加abstract
);
2、抽象類不能被實列化,只能通過子類來實現(xiàn);子類實現(xiàn)時,必須實現(xiàn)父類中所有的抽象方法;
3、抽象方法中的訪問權(quán)限,在子類中遵循訪問權(quán)限必須大于等于父類(如果父類定義的抽象類為:protected時,子類必須時public);
4、抽象類中的抽象方法不能設(shè)置成私有的:private
;
1、接口的關(guān)鍵字:interface;也無法實列化,
2、接口時純粹的模板,只定義功能而不包含實現(xiàn)方法
3、接口中的成員的訪問權(quán)限都是:public
;
4、接口中的成員:方法和常量(接口中幾乎很少使用);
5、接口實現(xiàn):可以通過抽象類實現(xiàn)部分方法,但在繼承的工作類中必須全部實現(xiàn);
6、通過implements
來繼承接口;可以多繼承以逗號分隔;
1、trait是一種特殊類的,無法實例化,只能通過宿主實現(xiàn);像一個函數(shù)(方法)集合;
2、通過use來嵌入宿主;trait之間可以調(diào)用;也可以同時調(diào)用多個trait;use A,B;
3、不同trait中的同名方法可以通過替代insteadOf
和as
別名來區(qū)分使用;
4、trait中的方法可以通過as別名的方法來改變方法的訪問權(quán)限;
1、abstract
、interface
、trait
三者都不能被實例化;
2、抽象類單繼承,接口可以多繼承,trait
可以工作中隨時使用;
3、方法實現(xiàn)遵循的優(yōu)先級:父類<trait
<本身;
4、接口中全部為抽象方法;一般不適合寫在接口和抽象類中方法和屬性一般都寫在trait;
1、代碼
<?php
namespace Test;
class A
{
public static function getClass(){
// 通過關(guān)鍵字static實現(xiàn)靜態(tài)延遲綁定;static與調(diào)用類綁定
return static::class;
}
public static function getC(){
// self代表當(dāng)前類,與定義它的當(dāng)前類綁定
return self::class;
}
}
class B extends A
{
}
echo B::getC();
echo '<br>';
echo A::getC();
echo '<hr>';
echo "靜態(tài)延遲綁定",'<br>';
echo B::getClass();
echo '<br>';
echo A::getClass();
namespace Test1;
class A
{
public static function getClass(){
// 通過關(guān)鍵字static實現(xiàn)靜態(tài)延遲綁定;static與調(diào)用類綁定
return '當(dāng)前的調(diào)用的是'.__METHOD__;
}
public static function getC(){
// self代表當(dāng)前類,與定義它的當(dāng)前類綁定
return static::getClass();
}
}
class B extends A
{
public static function getClass(){
// 通過關(guān)鍵字static實現(xiàn)靜態(tài)延遲綁定;static與調(diào)用類綁定
return '重寫后,當(dāng)前的調(diào)用的是'.__METHOD__;
}
}
echo '<hr>';
echo "靜態(tài)方法重寫",'<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,參數(shù)有:%s',$name,implode(',',$arguments));
}
public function __callStatic($name, $arguments)
{
printf('方法名:%s,參數(shù)有:%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>設(shè)置屬性攔截器:</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>靜態(tài)方法攔截器</h3>";
echo $obj::get(1,2,3);
2、演示結(jié)果
1、靜態(tài)方法調(diào)用:self::,parent::,static::
; 其中只有static::
與調(diào)用類綁定;
2、靜態(tài)方法調(diào)用時;如果不static
關(guān)鍵字靜態(tài)綁定的,是子類重寫靜態(tài)方法的是無效的;
3、構(gòu)造器:__construct()
;析構(gòu)器:__destruct()
;
4、屬性攔截器:
* __get( $property ) 訪問未定義的屬性時候被調(diào)用
* __set( $property, $value) 給未定義的屬性賦值時被調(diào)用
* __isset( $property ) 給未定義的屬性調(diào)用isset()時候被調(diào)用
* __unset( $property ) 給未定義的屬性調(diào)用unset()的時候被調(diào)用
5、方法攔截器:
* __call( $method, $arg_array ) 調(diào)用未定義的方法時候被調(diào)用
* __callStatic( $method, $arg_array ) 調(diào)用未定義的靜態(tài)方法時候被調(diào)用
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號