PHP學習 之 namespace

本文的示例代碼參考namespace

目錄

開始

mkdir -p vendor/lib1 && vim vendor/lib1/Person.php
<?php
class Person
{
    var $name, $age;

    function __construct($name, $age)
    {
        echo "__construct of lib1/Person.php" . "\n";
        $this->name = $name;
        $this->age = $age;
    }
}

PHP語法參考 X分鐘速成Y - 其中 Y=PHP

vim startup.php
<?php
require_once "vendor/lib1/Person.php";

$person = new Person("David", 6);
var_dump($person);
php startup.php
__construct of lib1/Person.php
object(Person)#1 (2) {
  ["name"]=>
  string(5) "David"
  ["age"]=>
  int(6)
}

PHP環(huán)境搭建參考 PHP學習 之 autoload

命名沖突

mkdir -p vendor/lib2 && vim vendor/lib2/Person.php
<?php
class Person
{
    var $name, $age;

    function __construct($name, $age)
    {
        echo "__construct of lib2/Person.php" . "\n";
        $this->name = $name;
        $this->age = $age;
    }
}
vim conflict.php
<?php
require_once "vendor/lib1/Person.php";
require_once "vendor/lib2/Person.php";

$person = new Person("David", 6);
var_dump($person);
php conflict.php
PHP Fatal error:  Cannot declare class Person, because the name is already in use in /Users/yuanlin/Workspace/php-tutorial/namespace/vendor/lib2/Person.php on line 2

命名空間

  • vendor/lib1/Person.php
vim vendor/lib1/Person.php
<?php

namespace lib1;

class Person
{
    var $name, $age;

    function __construct($name, $age)
    {
        echo "__construct of lib1/Person.php" . "\n";
        $this->name = $name;
        $this->age = $age;
    }
}

echo "namespace: ". __NAMESPACE__ . "\n";
php vendor/lib1/Person.php
namespace: lib1

常量__NAMESPACE__的值是包含當前命名空間名稱的字符串

  • vendor/lib2/Person.php
vim vendor/lib2/Person.php
<?php

namespace lib2;

class Person
{
    var $name, $age;

    function __construct($name, $age)
    {
        echo "__construct of lib2/Person.php" . "\n";
        $this->name = $name;
        $this->age = $age;
    }
}

echo "namespace: ". __NAMESPACE__ . "\n";
php vendor/lib2/Person.php
namespace: lib2
  • namespace.php
vim namespace.php
<?php

require_once "vendor/lib1/Person.php";
require_once "vendor/lib2/Person.php";

$person = new lib1\Person("David", 6);
var_dump($person);

$person = new lib2\Person("David", 6);
var_dump($person);

echo "namespace: ". __NAMESPACE__ . "\n";
php namespace.php
namespace: lib1
namespace: lib2
__construct of lib1/Person.php
object(lib1\Person)#1 (2) {
  ["name"]=>
  string(5) "David"
  ["age"]=>
  int(6)
}
__construct of lib2/Person.php
object(lib2\Person)#2 (2) {
  ["name"]=>
  string(5) "David"
  ["age"]=>
  int(6)
}
namespace:

在全局的即不包括在任何命名空間中的代碼 常量__NAMESPACE__的值是包含一個空的字符串

全局空間

在名稱前加上前綴\表示該名稱是全局空間中的名稱

vim global.php
<?php

echo strlen('123') . "\n";
echo \strlen('123') . "\n";
php global.php
3
3

引用規(guī)則

非限定名稱

vim regular_1.php
<?php

namespace app;

require_once "vendor/lib1/Person.php";
require_once "vendor/lib2/Person.php";

$person = new Person("David", 6);
var_dump($person);
php regular_1.php
PHP Fatal error:  Uncaught Error: Class 'app\Person' not found in /Users/yuanlin/Workspace/php-tutorial/namespace/regular_1.php:8

非限定名稱引用: current namespace + 非限定名稱

PS: 非限定名稱的詳細定義參考 使用命名空間:基礎(chǔ)

限定名稱

vim regular_2.php
<?php

namespace app;

require_once "vendor/lib1/Person.php";
require_once "vendor/lib2/Person.php";

$person = new lib1\Person("David", 6);
var_dump($person);
php regular_2.php
PHP Fatal error:  Uncaught Error: Class 'app\lib1\Person' not found in /Users/yuanlin/Workspace/php-tutorial/namespace/regular_2.php:8

限定名稱引用: current namespace + 限定名稱

完全限定名稱

vim regular_3.php
<?php

namespace app;

require_once "vendor/lib1/Person.php";
require_once "vendor/lib2/Person.php";

$person = new \lib1\Person("David", 6);
var_dump($person);
php regular_3.php
__construct of lib1/Person.php
object(lib1\Person)#1 (2) {
  ["name"]=>
  string(5) "David"
  ["age"]=>
  int(6)
}

完全限定名稱引用: 完全限定名稱

引用別名

vim alias.php
<?php

require_once "vendor/lib1/Person.php";
use lib1\Person as User;

$user = new User("David", 6);
var_dump($user);
php alias.php
__construct of lib1/Person.php

自動加載

PSR-0

  • PSR (PHP Standards Recommendations)

  • FIG (PHP Framework Interop Group) - Moving PHP forward through collaboration and standards

Deprecated - As of 2014-10-21 PSR-0 has been marked as deprecated. PSR-4 is now recommended
as an alternative

PSR-4

mkdir -p autoload/psr4 && cd autoload/psr4
vim composer.json
{
    "autoload": {
        "psr-4": {
            "App\\": "app/"
        }
    }
}
mkdir -p app/Core && vim app/Core/Request.php
<?php

namespace App\Core;

class Request {
    function __construct()
    {
        echo "__construct of App\Core\Request.php" . "\n";
    }
}

echo "namespace: ". __NAMESPACE__ . "\n";
composer update
vim psr4.php
<?php

require __DIR__.'/vendor/autoload.php';

use App\Core\Request;

$request = new Request();
php psr4.php
namespace: App\Core
__construct of App\Core\Request.php

classmap

cd ../..
mkdir -p autoload/classmap && cd autoload/classmap
vim composer.json
{
    "autoload": {
        "classmap": [
            "app"
        ]
    }
}
mkdir -p app/Core && vim app/Core/Request.php
<?php

namespace App\Core;

class Request {
    function __construct()
    {
        echo "__construct of App\Core\Request.php" . "\n";
    }
}

echo "namespace: ". __NAMESPACE__ . "\n";
composer update
vim classmap.php
<?php

require __DIR__.'/vendor/autoload.php';

use App\Core\Request;

$request = new Request();
php psr4.php
namespace: App\Core
__construct of App\Core\Request.php

classmap與PSR-4這兩種autoload方式有何區(qū)別?

files

cd ../..
mkdir -p autoload/files && cd autoload/files
vim composer.json
{
    "autoload": {
        "files": [
            "app/Core/Request.php"
        ]
    }
}
mkdir -p app/Core && vim app/Core/Request.php
<?php

namespace App\Core;

class Request {
    function __construct()
    {
        echo "__construct of App\Core\Request.php" . "\n";
    }
}

echo "namespace: ". __NAMESPACE__ . "\n";
composer update
vim files.php
<?php

require __DIR__.'/vendor/autoload.php';

use App\Core\Request;

$request = new Request();
php files.php
namespace: App\Core
__construct of App\Core\Request.php

files這種autoload方式的應(yīng)用場景?

參考

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末办桨,一起剝皮案震驚了整個濱河市晕翠,隨后出現(xiàn)的幾起案子蚪战,更是在濱河造成了極大的恐慌棘利,老刑警劉巖拧粪,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件修陡,死亡現(xiàn)場離奇詭異,居然都是意外死亡可霎,警方通過查閱死者的電腦和手機濒析,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啥纸,“玉大人,你說我怎么就攤上這事婴氮∷拱簦” “怎么了?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵主经,是天一觀的道長荣暮。 經(jīng)常有香客問我,道長罩驻,這世上最難降的妖魔是什么穗酥? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮惠遏,結(jié)果婚禮上砾跃,老公的妹妹穿的比我還像新娘。我一直安慰自己节吮,他們只是感情好抽高,可當我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著透绩,像睡著了一般翘骂。 火紅的嫁衣襯著肌膚如雪壁熄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天碳竟,我揣著相機與錄音草丧,去河邊找鬼。 笑死莹桅,一個胖子當著我的面吹牛昌执,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播统翩,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼仙蚜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了厂汗?” 一聲冷哼從身側(cè)響起委粉,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎娶桦,沒想到半個月后贾节,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡衷畦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年栗涂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祈争。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡斤程,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出菩混,到底是詐尸還是另有隱情忿墅,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布沮峡,位于F島的核電站疚脐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏邢疙。R本人自食惡果不足惜棍弄,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望疟游。 院中可真熱鬧呼畸,春花似錦、人聲如沸颁虐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽聪廉。三九已至瞬痘,卻和暖如春故慈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背框全。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工察绷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人津辩。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓拆撼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親喘沿。 傳聞我的和親對象是個殘疾皇子闸度,可洞房花燭夜當晚...
    茶點故事閱讀 44,665評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 作為一種通用開源腳本語言,PHP可以在不同的平臺上運行(Windows蚜印、LinuxUnix莺禁、MacOS X 等),...
    陽明先生1208閱讀 947評論 1 4
  • 命名空間概述 什么是命名空間窄赋?從廣義上來說哟冬,命名空間是一種封裝事物的方法。在很多地方都可以見到這種抽象概念忆绰。例如浩峡,...
    天譴殘魂閱讀 452評論 0 2
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)错敢,斷路器翰灾,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • 從予予一歲多開始,我們就喜歡帶著他行走在寧波的山山水水間稚茅,暢游在大自然中纸淮,身心都異常放松,這幾年我們單純地享...
    予and暖閱讀 319評論 0 2
  • 一直感覺2015年的年夜仿若昨日峰锁,當初在年夜上信誓旦旦要考取一個好的大學双戳,并堅信自己一定會成功,然而事實不...
    紫月天魅閱讀 521評論 16 6