PHP物件導向深入研究之【名稱空間】與【自動載入類】

桃子紅了吶發表於2017-01-01

名稱空間

避免類名重複,而產生錯誤。

<?php

require_once "useful/Outputter.php";

class Outputter {
    // output data
    private $name;

    public function setName($name) {
        $this->name = $name;
    }

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

$obj = new Outputter(); // 同一名稱空間下,類名不能相同,預設名稱空間為空。空也是一種名稱空間。
$obj -> setName("Jack");
print $obj->getName();
//namespace useful; // 更改名稱空間,否則查詢不到Hello類,Fatal error: Class `myHello` not found
$hello = new Hello();
?>

<?php
// useful/Outputter.php
namespace useful; // 名稱空間

class Outputter {
    // 
}

class Hello {
    
}
?>

如何呼叫名稱空間中的類

<?php

namespace comgetinstanceutil;

class Debug {
    static function helloWorld() {
        print "hello from Debug
";
    }
}

namespace main;
// comgetinstanceutilDebug::helloWorld(); // 找不到Debug類
comgetinstanceutilDebug::helloWorld(); // 加斜槓之後,就從根部去尋找了。

// outPut:hello from Debug
?>

使用use關鍵字

<?php

namespace comgetinstanceutil;

class Debug {
    static function helloWorld() {
        print "hello from Debug
";
    }
}

namespace main;
use comgetinstanceutil;
//Debug::helloWorld(); //Fatal error: Class `mainDebug` not found 
utilDebug::helloWorld();
?>

使用下面的處理,直接可以呼叫類

<?php

namespace comgetinstanceutil;

class Debug {
    static function helloWorld() {
        print "hello from Debug
";
    }
}

namespace main;
use comgetinstanceutilDebug; // 直接使用到類
Debug::helloWorld();
?>

表示全域性

global.php
<?php
// no namespace

class Lister {
    public static function helloWorld() {
        print "hello from global
";
    }
}
?>

<?php
namespace comgetinstanceutil;
require_once `global.php`;
class Lister {
    public static function helloWorld() {
        print "hello from ".__NAMESPACE__."
";  // __NAMESPACE__當前namespace
    }
}

Lister::helloWorld();  // access local
Lister::helloWorld(); // access global
?>

輸出:
hello from comgetinstanceutil
hello from global

名稱空間加{}

<?php
namespace comgetinstanceutil {
    class Debug {
        static function helloWorld() {
            print "hello from Debugn";
        }
    }
}

namespace main {
    comgetinstanceutilDebug::helloWorld();
}
?>
output:
hello from Debug

全域性名稱空間

<?php
namespace { // 全域性空間
    class Lister {
        public static function helloWorld() {
            print "hello from globaln";
        }
    }
}
namespace comgetinstanceutil {
    class Lister {
        public static function helloWorld() {
            print "hello from ".__NAMESPACE__."n";
        }
    }

    Lister::helloWorld();  // access local
    Lister::helloWorld(); // access global
}
?>

__autoload 自動載入類

ShopProduct.php
<?php

class ShopProduct {
    function __construct() {
        print "ShopProduct constructor
";
    }
}
?>

<?php
function __autoload( $classname ) { // 自動載入,根據類名載入類
    include_once( "$classname.php" );
}
$product = new ShopProduct( `The Darkening`, `Harry`, `Hunter`, 12.99 );
?>

output:
ShopProduct constructor

進一步優化處理

<?phpclass business_ShopProduct // 這裡的類命名就要遵循規則了function __construct() print"business_ShopProduct constructor
";?><?phpfunction __autoload( $classname ) $pathstr_replace(`_`,DIRECTORY_SEPARATOR,$classname);// 智慧化處理require_once("$path.php");$xnew();$ynew();?>


相關文章