PHP前言:
•動態地創建屬性和方法
•對象的復制
•對象的比較
•加載指定的文件
•自動加載類文件
•命名空間
示例
1、類的相關知識點 3(動態地創建屬性和方法)
class/class3.php
<?php /** * 類的相關知識點 3(動態地創建屬性和方法) */ // 用於演示如何動態地創建屬性(這就是 php 中所謂的重載) class Class1 { // __set 魔術方法,當設置的屬性不存在或者不可訪問(private)時就會調用此函數 public function __set($name, $value) { echo "__set \$name: {$name}, \$value: {$value}"; echo "<br />"; } // __get 魔術方法,當獲取的屬性不存在或者不可訪問(private)時就會調用此函數 public function __get($name) { echo "__get \$name: {$name}"; echo "<br />"; return 999; } } $objClass1 = new Class1(); // 當你設置的屬性不存在或者不可訪問(private)時,就會調用對應的 __set 魔術方法 $objClass1->property1 = wanglei; // 不可訪問的如 private ,或者不存在的 // 當你獲取的屬性不存在或者不可訪問(private)時,就會調用對應的 __get 魔術方法 echo $objClass1->property2; echo "<br />"; // 用於演示如何動態地創建方法(這就是 php 中所謂的重載) class Class2 { // __call 魔術方法,當調用的實例方法不存在或者不可訪問(private)時就會調用此函數 public function __call($name, $arguments) { echo "__call \$name: {$name}, \$arguments: " . implode(', ', $arguments); echo "<br />"; } // __callStatic 魔術方法,當調用的類方法不存在或者不可訪問(private)時就會調用此函數 public static function __callStatic($name, $arguments) { echo "__callStatic \$name: {$name}, \$arguments: " . implode(', ', $arguments); echo "<br />"; } } $objClass2 = new Class2(); // 當你調用的實例方法不存在或者不可訪問(private)時,就會調用對應的 __call 魔術方法 echo $objClass2->method1("aaa", "bbb"); // 當你調用的類方法不存在或者不可訪問(private)時,就會調用對應的 __callStatic 魔術方法 echo Class2::method2("aaa", "bbb");
2、類的相關知識點 4(對象的復制,對象的比較)
class/class4.php
<?php /** * 類的相關知識點 4(對象的復制,對象的比較) */ // 用於演示如何復制對象 class Class1 { public $field1 = "field1"; public $field2 = "field2"; // 通過 clone 復制對象時,會調用此魔術方法 function __clone() { echo "__clone"; echo "<br />"; } } $objClass1 = new Class1(); // 通過 clone 復制對象,會調用 __clone 魔術方法 $objClass2 = clone $objClass1; // 通過 clone 復制的對象為淺拷貝(shallow copy),即成員數據之間的一一賦值, 而所有的引用屬性仍然會是一個指向原來的變量的引用(如果要做 deep copy 則需要自己寫) echo $objClass2->field1; // output: field1 echo "<br />"; echo $objClass2->field2; // output: field2 echo "<br />"; // 如果兩個對象的屬性和屬性值都相等,則他們“==”相等, if ($objClass1 == $objClass2) { echo '$objClass1 == $objClass2'; echo "<br />"; } // 如果兩個對象的屬性和屬性值都相等,但不是同一個類的實例,則他們“===”不相等 if ($objClass1 !== $objClass2) { echo '$objClass1 !== $objClass2'; echo "<br />"; } // 如果兩個對象是同一個類的實例,則他們“===”相等 if ($objClass1 === $objClass1) { echo '$objClass1 === $objClass1'; echo "<br />"; } // 如果兩個對象是同一個類的實例,則他們“===”相等 $objClass3 = &$objClass1; if ($objClass1 === $objClass3) { echo '$objClass1 === $objClass3'; echo "<br />"; }
3、類的相關知識點 5(加載指定的文件,自動加載類文件)
class/class5.php
<?php /** * 類的相關知識點 5(加載指定的文件,自動加載類文件) */ /* * 包含並運行指定文件,可以是絕對路徑也可以是相對路徑 * include 找不到的話則警告,然後繼續運行(include_once: 在當前文件中只 include 指定文件一次) * require 找不到的話則錯誤,然後終止運行(require_once: 在當前文件中只 require 指定文件一次) * include ''; * require ''; * include_once ''; * require_once ''; */ // 演示如何通過 __autoload 魔術方法,來實現類的自動加載 function __autoload($class_name) { // 加載指定的文件 require_once $class_name . '.class.php'; } // 如果在當前文件中找不到 MyClass 類,那麼就會去調用 __autoload 魔術方法 $obj = new MyClass(); echo $obj->name; echo "<br />"; class/MyClass.class.php <?php class MyClass { public $name = "webabcd"; }
4、類的相關知識點 6(命名空間)
class/class6.php
<?php /** * 類的相關知識點 6(命名空間) */ // 以下代碼僅用於演示,實際項目中不建議在一個文件中定義多個 namespace // 如果當前文件中只有一個命名空間,那麼下面的這段可以省略掉命名空間的大括號,直接 namespace MyNamespace1; 即可 namespace MyNamespace1 { const MyConst = "MyNamespace1 MyConst"; function myFunction() { echo "MyNamespace1 myFunction"; echo "<br />"; } class MyClass { public function myMethod() { echo "MyNamespace1 MyClass myMethod"; echo "<br />"; } } } // 定義命名空間時,可以指定路徑 namespace Sub1\Sub2\MyNamespace2 { const MyConst = "MyNamespace2 MyConst"; function myFunction() { echo "MyNamespace2 myFunction"; echo "<br />"; } class MyClass { public function myMethod() { echo "MyNamespace2 MyClass myMethod"; echo "<br />"; } } } namespace MyNamespace3 { // 調用指定命名空間中的指定常量 echo \MyNamespace1\MyConst; echo "<br />"; // 調用指定命名空間中的指定函數 \MyNamespace1\myFunction(); // 實例化指定命名空間中的類 $obj1 = new \MyNamespace1\MyClass(); $obj1->myMethod(); } namespace MyNamespace4 { // use 指定的命名空間 use \Sub1\Sub2\MyNamespace2; // 之後不用再寫全命名空間的路徑了,因為之前 use 過了 echo MyNamespace2\MyConst; echo "<br />"; MyNamespace2\myFunction(); $obj1 = new MyNamespace2\MyClass(); $obj1->myMethod(); } namespace MyNamespace5 { // use 指定的命名空間,並為其設置別名 use \Sub1\Sub2\MyNamespace2 as xxx; // 之後再調用命名空間時,可以使用其別名 echo xxx\MyConst; echo "<br />"; xxx\myFunction(); $obj1 = new xxx\MyClass(); $obj1->myMethod(); }
以上所述是小編給大家介紹的PHP動態地創建屬性和方法, 對象的復制, 對象的比較, 加載指定的文件, 自動加載類文件, 命名空間 的相關介紹,希望對大家有所幫助!