萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> php編程 >> PHP的命名空間學習筆記與測試

PHP的命名空間學習筆記與測試

命名空間最初是在.net中可以使用了,不過現在php5.3開始也已經支持了命名空間這個東西了,下面一起來了解一下。


 PHP命名空間是PHP5.3開始支持。本篇講解PHP命名空間用法和PHP命名空間詳解。它的誕生使的我們在一個文件中可以使用多個同名的類而不沖突。
    好處:我們的項目有一個記錄日志文件的類,叫做Log。然後我們又必須要引入另一個代碼包,這個代碼包裡也有一個叫做Log的類。那麼在一個文件中,我們記錄日志的又需要給兩個類都寫一條日志。可以類同名了,怎麼辦?這個時候,命名空間應運而生。在Java等語言中命名空間是很早就已經提供了支持,而我大PHP一直到5.3才對命名空間提供了支持。
    示例一:
文件index.php
<?php
include 'test.php';

class index{
    public function a(){
        echo basename(__FILE__);
        echo '<br>';
        echo __CLASS__ . ' : ' . __METHOD__;
    }
}
$obj = new index();
$obj->a();
echo '<br>';
$obj1 = new test\index();
$obj1->a();
?>

文件test.php
<?php
namespace test;
class index{
    public function a(){
        echo basename(__FILE__);
        echo '<br>';
        echo __CLASS__ . ' : ' . __METHOD__;
    }
}
?>

    我們給index.php不設置命名空間,對test.php設置命名空間,名為test。運行index.php。
結果:
index.php
index : index::a
test.php
test\index : test\index::a

    我們看到了,同名的類也可以運行而不沖突了。

    示例二:
文件index.php
<?php
namespace index;
include 'test.php';

class index{
    public function a(){
        echo basename(__FILE__);
        echo '<br>';
        echo __CLASS__ . ' : ' . __METHOD__;
    }
}
$obj = new index();
$obj->a();
echo '<br>';
$obj1 = new \test\index();
$obj1->a();
?>

文件test.php
<?php
namespace test;
class index{
    public function a(){
        echo basename(__FILE__);
        echo '<br>';
        echo __CLASS__ . ' : ' . __METHOD__;
    }
}
?>

    我們給index.php設置命名空間,名為index,對test.php設置命名空間,名為test。運行index.php。
結果:
index.php
index\index : index\index::a
test.php
test\index : test\index::a

    比較示例一和二,不對index.php設置命名空間,即該文件是整個PHP全局命名空間下面的一個文件,那麼使用test\index()即可,如果對index.php設置命名空間,即在其他的命名空間中使用命名空間,就要多一個“\”,就要使用\test\index()。

示例三:
文件index.php
<?php
namespace index;

include 'namespace.php';

use \test\test1\test2 as test2;

class index{
    public function a(){
        echo basename(__FILE__);
        echo '<br>';
        echo __CLASS__ . ' : ' . __METHOD__;
    }
}

$obj = new index();
$obj->a();

echo '<br>';

$obj1 = new \test\test1\test2\index();
$obj1->a();

echo '<br>';

$obj1 = new test2\index();
$obj1->a();

文件test.php
<?php
namespace test\test1\test2;
class index{
    public function a(){
        echo basename(__FILE__);
        echo '<br>';
        echo __CLASS__ . ' : ' . __METHOD__;
    }
}

結果:
index.php
index\index : index\index::a
test.php
test\test1\test2\index : test\test1\test2\index::a
test.php
test\test1\test2\index : test\test1\test2\index::a

    這說明了什麼?別名!用過SQL吧。
select COUNT(*) as `count` from `tebleName`

    嗯,一個意思。\test\test1\test2這個名字太長了,就別名為test2就好了。使用了use之後呢,這個命名空間就想到於是在index這個命名空間下面了,而不是全局命名空間的一員了,所以使用test2\index(),而不是\test2\index()。

    別名時在PHP代碼編譯的時候執行的,而變量的解析則要更晚。也就是說不能對變量運用use關鍵字。示例如下(摘自官方手冊示例):
<?php
use My\Full\Classname as Another, My\Full\NSname;

$obj = new Another; // 實例化一個 My\Full\Classname 對象
$a = 'Another';
$obj = new $a;      // 實際化一個 Another 對象

copyright © 萬盛學電腦網 all rights reserved