PHP魔法方法

2018-02-22 16:40 更新

PHP教程 - PHP魔法方法

每當你看到一個方法名以雙下劃線開頭,它是一個“魔法"方法。PHP保留所有以 __ 開頭的方法。

PHP類構造函數(shù)

構造函數(shù)是一種特殊的方法當你創(chuàng)建一個實例時由PHP調用類。

PHP類構造函數(shù)具有以下語法。

public function __construct(Optional Parameter) {}
<?PHP
   class MyClass { 
     function __construct() { 
       echo "I am being constructed."; 
     } 
   } 
          
   $obj = new MyClass;  
?>

上面的代碼生成以下結果。

類MyClass包含一個非常簡單的構造函數(shù),只顯示消息。 當代碼然后從該類創(chuàng)建一個對象,調用構造函數(shù)并顯示消息。



實施例2

你可以傳遞參數(shù)到構造函數(shù),像正常的方法。

<?PHP
   class Person { 
     private $_firstName; 
     private $_lastName; 
     private $_age; 
          
     public function __construct( $firstName, $lastName, $age ) { 
       $this-> _firstName = $firstName; 
       $this-> _lastName = $lastName; 
       $this-> _age = $age; 
     } 
   } 
          
   $p = new Person( "James", "Bond", 28 ); 
?>

Person類包含三個私有屬性和接受三個值的構造函數(shù),將三個屬性設置為這些值。



實施例3

如果一個類包含一個構造函數(shù),它只有在從該類創(chuàng)建對象時才被調用。

如果從子類創(chuàng)建對象,則只調用子類的構造函數(shù)。

要使子類調用其父構造函數(shù),調用parent :: __ construct()。

<?PHP
class NameTag {
       public $Words;
}

class Book {
       public $Name;

       public function say() {
               print "Woof!\n";
       }

       public function __construct($BookName) {
               print "Creating a Book: $BookName\n";
               $this->Name = $BookName;
       }
}


class ComputerBook extends Book {
       public function say() {
               print "Computer!\n";
       }

       public function __construct($BookName) {
               parent::__construct($BookName);
               print "Creating a computer book\n";
       }
}
?>

最好先調用 parent :: __ construct()一個子類的構造函數(shù),以便設置所有父類的屬性。

PHP類析構函數(shù)

析構函數(shù)用于在對象從內存中刪除之前對其進行整理。

除了使用構造函數(shù)外,您可以使用與構造函數(shù)相同的方式創(chuàng)建析構函數(shù)方法__destruct()而不是__construct():

function __destruct() { 
    // (Clean up here) 
}   

刪除對象時調用PHP析構函數(shù)。析構函數(shù)方法 __ destruct()不帶參數(shù)。

<?PHP
class Book {
       public $Name;
       public function say() {
               print "Woof!\n";
       }

       public function __construct($BookName) {
               print "Creating a Book: $BookName\n";
               $this->Name = $BookName;
       }
        public function __destruct() {
               print "{$this->Name} is destructing\n";
        }

}
$aBook = new Book("PHP");
?>

上面的代碼生成以下結果。

調用parent :: __ construct()。

關鍵的區(qū)別是,你應該調用 parent :: __ destruct()本地代碼的銷毀。 例如:

<?PHP
public function __destruct() {
       print "{$this->Name} is no more...\n";
       parent::__destruct();
}
?>

下面的代碼顯示了如何create構造函數(shù)和析構函數(shù)。

<?php
  class Counter
  {
    private static $count = 0;

    function __construct()
    {
      self::$count++;
    }

    function __destruct()
    {
      self::$count--;
    }

    function getCount()
    {
      return self::$count;
    }
  }

  //create one instance
  $c = new Counter();

  //print 1
  print($c->getCount() . "<br>\n");

  //create a second instance
  $c2 = new Counter();

  //print 2
  print($c->getCount() . "<br>\n");

  //destroy one instance
  $c2 = NULL;

  //print 1
  print($c->getCount() . "<br>\n");
?>


上面的代碼生成以下結果。

刪除對象

在對象上調用 unset()會調用它的析構函數(shù)在刪除對象之前。

魔法方法列表

PHP允許你創(chuàng)建三個“魔術"方法,你可以使用攔截屬性和方法訪問:

  • __get() is called whenever the calling code attempts to read an invisible property of the object
  • __set() is called whenever the calling code attempts to write to an invisible property of the object
  • __call() is called whenever the calling code attempts to call an invisible method of the object

可見是指不存在的屬性或方法或私人或保護財產或方法。

__得到()

__get()指定什么當加載未知屬性時。

例如:

<?PHP
     class Book {
             public $Name;


             public function __get($var) {
                     print "Attempted to retrieve $var and failed...\n";
             }
     }
     $aBook = new Book;
     print $aBook->Price;
?>
Overloading Property Accesses with __get()
<?PHP
            class Car { 
              public function __get( $propertyName ) { 
                echo "The value of "$propertyName" was requested < br / > "; 
                return "blue"; 
              } 
            } 
                  
            $car = new Car; 
            $x = $car->color; 
            echo "The car"s color is $x \n";
?>

上面的代碼生成以下結果。

__組()

使用__set()方法來捕獲將不可見屬性設置為值的嘗試,請使用需要兩個參數(shù):屬性名和要設置它的值。

它不需要返回值:

public function __set( $propertyName, $propertyValue ) { 
   // (do whatever needs to be done to set the property value) 
}      

設置時調用__set()魔術方法未定義屬性。

<?PHP
      class Book {
              public function __set($var, $val) {
                      print("UPDATE $var = "$val";");
              }

      }

      $book = new Book();
      $book ->Price= 1.2;
?>

上面的代碼生成以下結果。

__呼叫()

使用__call()來處理對類的不存在的方法的調用。該方法應該返回一個值(如果有)回調用代碼:

public function __call( $methodName, $arguments ) { 
   // (do stuff here) 
   return $returnVal; 
} 

當調用缺少的方法時,調用__call()魔術方法。這里是一個__call()的例子:

<?PHP
     class Book {
             public function __call($function, $args) {
                     $args = implode(", ", $args);
                     print "Call to $function() with args "$args" failed!\n";
             }
     }

     $aBook = new Book;
     $aBook->nonExistingMethod("foo", "bar", "baz");
?>

上面的代碼生成以下結果。

__toString()

__toString()允許您為對象設置字符串值。

<?PHP
     class Cat {
             public function __toString() {
                     return "This is a cat\n";
             }
     }

     $c = new Cat;
     print $c;
?>

上面的代碼生成以下結果。

實施例5

下面的代碼顯示了如何創(chuàng)建__clone方法。

<?php
  class ObjectTracker
  {
    private static $nextSerial = 0;
    private $id;
    private $name;

    function __construct($name)
    {
      $this->name = $name;
      $this->id = ++self::$nextSerial;
    }

    function __clone()
    {
      $this->name = "Clone of $that->name";
      $this->id = ++self::$nextSerial;
    }

    function getId()
    {
      return($this->id);
    }

    function getName()
    {
      return($this->name);
    }
  }

  $ot = new ObjectTracker("Zeev"s Object");
  $ot2 = clone $ot;

  //1 Zeev"s Object
  print($ot->getId() . " " . $ot->getName() . "<br>");

  //2 Clone of Zeev"s Object
  print($ot2->getId() . " " . $ot2->getName() . "<br>");
?>


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號