php魔術常量和魔術方法
1.概述
__get:獲取私有屬性值的時候呼叫
__set:設定私有屬性值的時候呼叫
__construct:構造方法
__destruct:析構方法
__unset
觸發時機:當銷燬一個私有成員屬性的時候呼叫
引數:屬性名
__isset
觸發時機:當判斷一個私有成員屬性是否被設定過時呼叫
引數:屬性名
__invoke(瞭解)
觸發時機:當將一個物件當作函式使用的時候被呼叫
引數:任意多個,呼叫時傳遞多少個這裡就寫多少個
__toString(瞭解)
觸發時機:當echo一個物件的時候呼叫
引數:沒有引數
返回值:返回一個字串,該字串就會被打印出來,這個字串需要自己定製
__debugInfo(瞭解)
觸發時機:當var_dump來列印這個物件的時候呼叫
引數:沒有引數
返回值:返回一個自定義的陣列,你想列印什麼就打什麼
__call
觸發時機:當呼叫一個不存在的成員方法的時候觸發
引數:方法名 引數陣列
__callStatic(講完靜態方法時候再講)
$this->成員屬性:在類裡面訪問自己的成員屬性和方法。
public:公共的,在類內和類外都可以直接訪問
private:私有的一般在類外不能訪問。
2.魔術方法:
(1)__unset():用unset銷燬一個私有的成員屬性的時候呼叫,引數:屬性名。
<?php class Cat { public $nmae; private $age; private $height; public function __construct($name, $age, $height) { $this->name = $name; $this->age = $age; $this->height = $height; } public function miao() { echo 'miaomiao'; } public function __unset($arg) { echo $this->$arg . '被銷燬了'; } } $bosi = new Cat('波斯貓', 10, 20); unset($bosi->age);
(2)__isset():當判斷一個私有的成員屬性是否被設定時呼叫,引數:屬性名。
<?php
class Cat
{
.......
public function __isset($arg)
{
return isset($this->$arg);
}
}
isset($bosi->age);
(3)__invoke:當將一個物件當做函式時被呼叫,引數任意多個,呼叫時傳遞多少個這裡就寫多少個。
<?php
class Dog
{
public $name = 'wang';
public function wangwang()
{
echo '旺旺';
}
public function __invoke($a,$b,$c)
{
echo '將物件作為函式使用了';
}
}
$tai = new Dog();
$tai(100,200,300);
(4)__toString:當echo一個物件的時候呼叫,這個函式裡面返回什麼字串echo的時候就打印出什麼。沒有引數,但是有返回值,返回一個字串,該字串需要自己定製。
<?php
class Dog
{
......
public function __toString()
{
return '我的姓名是'.$this->name;
}
}
$tai = new Dog();
echo $tai;
(5)__debugInfo():觸發時機:當使用var_dump()列印物件的時候會呼叫。返回一個自定義的陣列,數組裡面是需要列印的東西,沒有引數。
<?php
class Dog
{
......
public function __debugInfo()
{
return ['name','age'];
}
}
$tai = new Dog();
var_dump($tai);
(6)__call():呼叫不存在的成員方法時會自動呼叫該方法。引數:方法名,引數陣列。
<?php
class Dog {
//.......
function __call($name, $args) {
var_dump($name); //函式名
var_dump($args);
}
}
$tai = new Dog();
$tai->eat(100, 100);
結果:
string(3) "eat"
array(2) {
[0] =>
int(100)
[1] =>
int(100)
}
例項化一個物件後,當呼叫這個物件的成員方法存在時,則直接呼叫其成員方法,但是當成員方法不存在時,將轉而去呼叫__call方法。
同時__call必須有兩個引數,這個引數名可以隨意取,但是為了方便我們通常取為$name和$args
當成員方法不存在時,__call將被呼叫,同時,這個不存在的方法名稱會作為字串傳遞給第一個引數(這裡第一個引數是$name),將呼叫時傳遞的引數作為列表傳遞給第二個引數(這裡第二個引數是$args)。
(7)__callStatic():呼叫不存在的靜態方法時
3.連貫操作(鏈式操作):
資料庫操作類查詢的時候有很多條件:
$model->limit()->where()->filed()->table()->select()
<?php
class Model
{
function filed()
{
return $this;
}
function limit()
{
return $this;
}
....
function select()
{
//返回查詢結果。
}
}
4.通過__call實現單欄位的查詢:
<?php
function __call($name,$args)
{
$str = substr($name,0,5);
if($str == 'getBy'){
$filed =
}
}
未完待續
5.繼承:
(1)繼承:考慮的是從相同的屬性來理解,子類的特徵一般多於父類。
派生:其實和繼承描述的是同一個東西,但是從兩個不同的方面來理解的,繼承考慮的是相同的屬性來考慮的,派生是從不同的屬性來理解的。
父子類的叫法:父類(基類)、子類(派生類)
單繼承:php是單繼承的,子類只能有一個父類。
(2)繼承的基本語法:
在程式碼中子類如果繼承父類,那麼就擁有父類的屬性和行為(某些訪問控制除外)。
<?php
class Father
{
public $name = '翠花';
public $age = 18;
public $height = 160;
function eat()
{
echo '大口吃飯';
}
function sleep2()
{
echo '睡覺覺';
}
}
class Son extends Father
{
}
$hua = new Son();
$hua->sleep2();
6.訪問許可權:
public:公共的,類外類內都可以直接訪問
private:私有的,類外不可以直接訪問
protected:受保護的,類外不可直接訪問,類內可以
<?php
class Girl
{
public $name = '劉亦菲';
private $age = 18;//私有的不能被繼承
protected $weight = 90;//可以被繼承
function say()
{
echo '我叫'.$this->name;
}
}
class daughter extends Girl
{
function test()
{
echo '我叫'.$this->name;
}
}
$liu = new daughter();
$liu->test();
7.靜態屬性和靜態方法
靜態屬性是屬於整個類的,而不是屬於某個物件的
靜態方法的呼叫
注意事項:(1)靜態方法中不能出現$this關鍵字,
$this是屬於某個物件的,但是該靜態方法是屬於整個類的而不是屬於某個物件的。
(2)靜態屬性和方法前面可以加屬性修飾符。
(3)使用靜態屬性和方法可以提高效率,通過類名就可以使用裡面的屬性和方法。
(4)可以實現單例(單一例項)
<?php
類外呼叫---》類名::靜態方法名();
類內呼叫---》$this::方法名();
8.自動載入
規則:一個類就是一個檔案,檔名要和類名相同。
__autoload:當在當前指令碼中去載入一個不存在的類的時候會呼叫這個方法。
當載入一個類,這個類繼承了其他的類,只要找不到就可以呼叫__autoload(),引數就是要載入的類名。
M:model 模型 和資料庫打交道
V:View 檢視,html檔案(模板)
C:controller控制器(資料和模板之間的橋樑)
注意:這個方法是唯一的一個寫在類外的方法。
<?php
class Car {
public $name;
public $money;
public $speed;
function run() {
echo '汽車在高速上面跑';
}
}
<?php
function __autoload($name) //$name就是類名
{
echo '我被呼叫了';
$fileName = $name . '.php';
include $fileName;
}
//include 'Car.php';
//自動載入
$bmw = new Car();
$bmw->run();
目錄結構(資料夾)結構:
model存放資料庫檔案
view存放介面檢視檔案
controller存放控制器檔案
vendor:第三方的庫檔案
入口檔案:index.php(mvc下面)
---------------------
作者:zhongjie01
來源:CSDN
原文:https://blog.csdn.net/zhongjie01/article/details/69394062
版權宣告:本文為博主原創文章,轉載請附上博文連結!