1. 程式人生 > >php魔術常量和魔術方法

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  
版權宣告:本文為博主原創文章,轉載請附上博文連結!