速戰速決 (5) - PHP: 動態地創建屬性和方法, 對象的復制, 對象的比較, 加載指定的文件, 自動加載類文件, 命名空間


[源碼下載]


速戰速決 (5) - PHP: 動態地創建屬性和方法, 對象的復制, 對象的比較, 加載指定的文件, 自動加載類文件, 命名空間



作者:webabcd


介紹
速戰速決 之 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();
}



OK
[源碼下載]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM