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();//您訪問的靜態方法類沒有
更多學習內容請訪問:
怎么從一名碼農成為架構師的必看知識點:目錄大全(不定期更新)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/77615.html
標籤:PHP
上一篇:Spring Security OAuth2 使用ResourceServerConfigurerAdapter鑒權后如何再進行資料鑒權
