PHP 面向對象 靜態屬性 static // 使用場景: 類的一些公用屬性和方法,值有可能改變 // 如何訪問 靜態屬性呢 // 通過 self::方法 或者 屬性 , 就可以訪問到類的靜態屬性 # 切記: 靜態屬性和方法只能類自己訪問,不能實例對象訪問。 <?php class People { ...
PHP 面向對象
靜態屬性 static
// 使用場景: 類的一些公用屬性和方法,值有可能改變
// 如何訪問 靜態屬性呢
// 通過 self::方法 或者 屬性 , 就可以訪問到類的靜態屬性
# 切記: 靜態屬性和方法只能類自己訪問,不能實例對象訪問。
<?php
class People {
protected static $className = '大三老學長';
public function getClassName(){
echo '他是'.self::$className;
#他是大三老學長
}
}
const 類常量定義使用
// 使用場景: 值不會變化時,使用
// 如何訪問const 常量
// self::常量名字
<?php
class Peole {
const NAME = '海軍';
public function getName(){
echo self::NAME;
}
}
$hj = new Peole();
$hj->getName();
# 海軍
禁止重寫父類方法或者屬性 final
//使用場景: 父類不想讓子類重寫自己的方法或者屬性 時使用
# 使用 final
<?php
# 父類
class Peole {
const NAME = '海軍';
# 在 function 前加 final
public final function getName(){
echo self::NAME;
}
}
# 子類
class Woman extends Peole {
public function getName(){
echo '子類不能重寫父類';
}
}
$woman = new Woman();
$woman->getName(); # 調用時,結果報錯
抽象類抽象方法
// 使用場景:子類繼承了父類, 並且必須實現父類的某些方法 時使用
# 格式: abstract
# 註意: 類為抽象類時;不能實例化對象調用方法和屬性,類本身也不能自身調用屬性和方法。
<?php
abstract class Peole {
protected static $className = '大三老學長';
//抽象方法
abstract public function learn();
public function getClassName(){
echo '他是'.self::$className;
}
}
class Woman extends Peole {
public function getName(){
echo '子類不能重寫父類';
}
public function learn(){
echo '有閱讀的能力';
}
}
// 類為抽象類時不能實例化對象,也不能自己調用自己
// $hj = new Peole();
// $hj->getName();
// echo "<hr/>";
// $hj->getClassName();
class Woman extends Peole {
public function getName(){
echo '子類不能重寫父類';
}
public function learn(){
echo '有閱讀的能力';
}
}
$woman = new Woman();
$woman->getName();
$woman->learn();
變相多繼承 Trait 使用
//使用場景: 當類需要繼承多個基類時採用,(PHP以前一直是單繼承)
// 格式:
#trait 變數名{} 類中使用trait: use 變數名
# 1.基本使用
<?php
trait Student {
public $name = '姓名';
public function getNames(){
echo __METHOD__;
}
}
class School {
use Student;
}
$smallSchool = new School();
echo $smallSchool->name;
$smallSchool->getNames();
Trait 優先順序
# 2.優先順序問題,
#2.1父類和基類有同樣的方法,調用訪問時會訪問父類的方法
#2.2子類繼承了父類,也使用了trait,調取同樣的方法時,優先採 用trait的方法
<?php
trait Student {
public $name = '姓名';
public function getNames(){
echo '我是 trait';
}
}
class School {
use Student;
public function getNames(){
echo '我是 School';
}
}
class Teacher extends School {
use Student;
}
$teacher = new Teacher();
$teacher->getNames();
// 結果為: 我是 trait
// 當子類繼承了父類, 父類和trait 有同樣的方法, 子類實例對象調用同樣方法名時,優先採用trait的方法
解決Trait 方法衝突 insteadOf as
// 應用場景: 當多個trait時,可能會有同名的方法,類的實例對象調用時,就會衝突;
# 解決辦法: 1.insteadOf 2. as
# use 變數1,變數2{
# 變數1:: getNames insteadOf 變數2;
// 解釋: 變數1的getNames 方法替代了 變數2
# Patriarch:: getNames as getToName;
// 解釋: 將變數2的方法通過 as 別名,調用
# }
<?php
trait Student {
public $name = '姓名';
public function getNames(){
echo '我是 Student';
}
}
trait Patriarch {
public function getNames(){
echo '我是 Patriarch';
}
}
class School {
use Student,Patriarch{
Student:: getNames insteadOf Patriarch;
Patriarch:: getNames as getToName;
}
public function getNames(){
echo '我是 School';
}
}
$school = new School();
$school->getNames(); //我是 School
echo "<hr/>";
$school->getToName();
echo "<hr/>"; //我是 Patriarch
Trait 訪問控制 protected
trait Patriarch {
protected function getNames(){
echo '我是 Patriarch';
}
}
class School {
use Patriarch{
Patriarch:: getNames as getToName;
}
}
$school = new School();
$school->getToName(); //訪問就會報錯,受保護的
Trait 使用情況
- Trait 中可以使用 abstract 方法
- Trati 中可以使用 靜態方法
魔術方法
所謂魔術方法,它就是PHP 中提供了一些函數,在某些時刻自動調用,處理一些邏輯,執行時間不同。
類似於 生命周期, 鉤子函數。
construct 構造函數
<?php
class Girl{
private $name;
public function __construct(String $names)
{
echo $this->name = $names;
}
}
new Girl('小紅');
_set and _get
// 使用場景: 一般類的屬性或者方法為私有或者受保護的,這樣類的實例是不能直接訪問和修改的,想訪問類的這些屬性就得使用 _set _get 方法, 當訪問私有屬性或者方法時,會自動調用_set and _get 方法中的內容。
# 格式: set 有兩個參數 get有一個參數
public function __get($names)
{
echo '獲取私有和受保護的屬性時,自動調用';
return $this->$names;
}
public function __set($name, $value)
{
echo '設置私有和受保護的屬性時,自動調用------';
$this->$name = $value;
}
# 註意: 如果類中沒有創建這兩個函數 _set _get ,在訪問私有屬性 方法和受保護屬性方法就會警告。
#完整代碼
<?php
class Car {
private $price = '$9w';
private $name = '奧迪';
public $place = '美國';
public function __get($names)
{
echo '獲取私有和受保護的屬性時,自動調用';
return $this->$names;
}
public function __set($name, $value)
{
echo '設置私有和受保護的屬性時,自動調用------';
$this->$name = $value;
}
}
$car = new Car();
echo '<hr/>';
echo $car->name;
echo '<hr/>';
echo $car->place;
echo '<hr/>';
$car->prive = '22$';
echo $car->price;
# 輸出內容
獲取私有和受保護的屬性時,自動調用奧迪
美國
設置私有和受保護的屬性時,自動調用------獲取私有和受保護的屬性時,自動調用22$
_call
//使用場景: 當調用了類中不存在的方法時,程式會停止運行,為了防止 誤調用,程式斷開,使用_call 來處理此情況
# 格式
__call($functionName, $arg) 參數1為方法名 參數2 為傳遞參數
# 完整代碼
<?php
class Car {
public function __call($functionName, $arg)
{
echo '類中沒有該函數,函數名為:'.$functionName;
echo '<hr/>';
print_r($arg);
}
}
$car = new Car();
$car->run(1,2,3,4); //類中沒有該函數,函數名為:run Array ([0] => 1[1] => 2[2] => 3[3] => 4 )
__callStatic
//使用場景: __callStatic 當調用的靜態方法不存在或許可權不足時,會自動調用__callStatic方法。
# 格式
__callStatic($functionName, $arg) 參數1為方法名 參數2 為傳遞參數
#完整代碼
<?php
class Car {
public function __call($functionName, $arg)
{
echo '調用函數名為'.$functionName;
echo '<hr/>';
print_r($arg);
}
public static function __callStatic($name, $arguments)
{
switch ($name) {
case 'fly':
echo 'Fly : -------> 通過switch 來判斷執行不同的業務邏輯';
break;
default:
echo '您訪問的靜態方法類沒有';
}
}
}
Car::fly();//Fly : -------> 通過switch 來判斷執行不同的業務邏輯
echo '<hr/>';
Car::eat();//您訪問的靜態方法類沒有
更多學習內容請訪問:
怎麼從一名碼農成為架構師的必看知識點:目錄大全(不定期更新)