PHP ??????(??????)
PHP 5.3?? PHP ??????(namespace)? ???????.
??????? ?????? ????? ??? ??????? ??? ????? ?????. ? ???? ??? ?? ??? ??? ? ????. ?? ?? ???????
????? ?? ??? ????? ? ????, ????? ?? ??? ?? ?????? ??? ???. ?? ??, foo.txt ??? /home/greg ? /home/other ????? ??? ??? ? ??? ? ?? foo.txt ??? ??? ????? ??? ?? ????. ?? /home/greg ???? ???
foo.txt ??? ???? ? /home/greg/foo.txt? ????? ?? ?? ?? ???? ??? ???? ?? ??? ??? ???. ????? ??? ???? ? ??? ??
?????? ????.
PHP ??????? ?? ? ?? ??? ??? ??? ? ????. 1. PHP ?? ???/??/?? ?? ?? ???/??/?? ?? ?? ??.
2. ?? ??? ???? ??? ?? ?? ? ??? ??(????? ? ?? ??? ??? ???? ?? ???)? ?? ??(?? ??) ??? ????.
?????? ?? ????? ?? ??, ??? ? ?? ??? PHP? ??????? ???? ?? ????? ?? ??? ?????.
??????? ??? ??????? ???? ?????. ??? ??????? ???? ??? ?? ?? ???? ?? ??????? ???? ???.
??? ??? ????. <?php
// 定義代碼在 'MyProject' 命名空間中
namespace MyProject;
// ... 代碼 ...
?>
你也可以在同一個(gè)文件中定義不同的命名空間代碼,如:
<?php
namespace MyProject1;
// MyProject1 命名空間中的PHP代碼
namespace MyProject2;
// MyProject2 命名空間中的PHP代碼
// 另一種語法
namespace MyProject3 {
// MyProject3 命名空間中的PHP代碼
}
?>
??????? ???? ?? ??? ??? ??? ?? ??? ??? ???? ??????. ????????. ?? ?? ??? ??? ?? ? PHP ??? ?????? ?? ?? ??? ? ????:
<?php declare(encoding='UTF-8'); //定義多個(gè)命名空間和不包含在命名空間中的代碼 namespace MyProject { const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } } namespace { // 全局代碼 session_start(); $a = MyProject\connect(); echo MyProject\Connection::start(); } ?>
. ?? ???
<html> <?php namespace MyProject; // 命名空間前出現(xiàn)了“<html>” 會(huì)致命錯(cuò)誤 - 命名空間必須是程序腳本的第一條語句 ?>
??? ?????. ?????? ? ????? ?? ?? ??? ?? ?????. PHP ??????? ???? ??? ?????? ??? ??? ?? ????. ??? ?????? ??? ??? ???? ??? ? ????.
<?php namespace MyProject\Sub\Level; //聲明分層次的單個(gè)命名空間 const CONNECT_OK = 1; class Connection { /* ... */ } function Connect() { /* ... */ } ?>
?? ???? ?? MyProjectSubLevelCONNECT_OK, MyProjectSubLevelConnection ??? ? MyProjectSubLevelConnect ??? ????.
?????? ??? ?????? ?? ??? ???? ?? PHP? ??? ?????? ??? ??? ??? ???? ???. PHP ??????? ?? ???? ???? ??? ? ????. ?? ???? ??? ???? ??? ? ??? ????: 1. foo.txt? ?? ?? ?? ?? ??. currentdirectory/foo.txt? ?? ?????. ??? currentdirectory? ?? ????? ?????. ??? ?? ????? /home/foo?? ?? ??? /home/foo/foo.txt? ?????. 2. ?????? ??????/foo.txt ?????. currentdirectory/subdirectory/foo.txt? ?? ?????. ? ? 3. ?? ???? /main/foo.txt ?????. ?? /main/foo.txt? ?? ?????. PHP ??????? ??? ??? ??? ?????. ?? ?? ??? ??? ?? ? ?? ???? ??? ? ????. 1. ????? ?? ?? ?? ??? ? ?? ??? ??(?: $a=) ??? foo(); ?? foo::staticmethod();. ?? ??????? currentnamespace?? foo? currentnamespacefoo? ?????. foo? ???? ??? ?? ???? ?? ???????? ??? ???? ?? ?? foo? foo? ?????. ??: ??????? ?? ?? ??? ???? ?? ?? ????? ?? ?? ?? ?? ??? ?? ?? ?? ?? ???? ?????. 2. $a = new subnamespacefoo() ?? subnamespacefoo::staticmethod();? ?? ??? ? ??? ?? ?? ?????. ?? ??????? currentnamespace?? foo? currentnamespacesubnamespacefoo? ?????. foo? ???? ??? ?? ??? ??, ?? ???????? ???? ?? ??? foo? subnamespacefoo? ?????. 3.? ???? ?? ?? ?? ??? ???? ???? ?? ?: $a = new currentnamespacefoo::staticmethod ( );. ? ?? foo? ?? ???? ??? ?? currentnamespacefoo? ?????. ??? ? ? ?? ??? ??? ????. ? ? ?? ???, ?? ?? ??? ?????? strlen(), Exception ?? INI_ALL? ?? ???? ??? ??? ? ????. ?????? ?? ?? ???, ?? ? ??? ???: ?????? ? ?? ?? ?? PHP ?????? ?? ??? ?? ??: ?? ??? ???? ??. ??? ?? ??? ??????? ????? ?? ??? ???? ??????. ???? ???? ?? ??: ??? ??::__??
?? ??
global ? ???? ??(?????? ???? ??? ??? ??)? ???? ???. ?? ??? ??, ?? ?? ?? ?? ????? ???? ??? ???? ?? ??? ??? ???? ?? ????? ???? ????. ???? ?????? ??? ?? ?? ??? ???? ?? ?? : classname::__construct
?? ??
???
??? ??::__??
?? ??
???
?????????????::__construct
?????????????::__construct
????????????
????????????
??????? ??
?????? ?????? ??? ? __NAMESPACE__ ?? PHP? ??? ?????. ?? ?????? ?? ??? ????? ? ?? ?? ???? __NAMESPACE__ ?? ??? ?????? ??????. ?? __NAMESPACE__? ?? ?? ??????? ??? ???? ??????. ??????? ???? ?? ?? ???? ? ???? ?????. ? __NAMESPACE__ ?, in ??????? ?? ???? ?? ??: "MyProject" Instance __NAMESPACE__ ?, ?? ?? ???? ?? ??: "" ???? ?? __NAMESPACE__? ??? ???? ??? ? ?????. ?: __NAMESPACE__? ???? ???? ?? ?? namespace ???? ?? ??????? ?? ??????? ??? ????? ????? ? ??? ? ????. ???? self ???? ?????. ???? ?????? ???, ??????? ?? ???? ?????? ???, ?? ?? ?????? ??: alias/import PHP ?????? ???? ?? ?? ????? ???? ? ?? ??: ??? ??? ??? ????? ?????? ??? ??? ?????. PHP? ??? ??? ??? ???? ????. PHP?? ????? ??? ??? ?? ?????. ??? ??? ? ?? ???? ??? ?? ???? ????. 1, use ???? ???? ?? ????/?? 2. ? ?? ?? ?? use ?? ?????. 3. ?? ?? ???? 4. ???? ?? ???? ?????? ??: ?? ?? ??/?? PHP? ?????? ??? ????? ?? ???, ?? ?? ?? ??? ???? ?? ?? ?? ??? ???? ??? ?????. ??? ??? ?? ?? ??????? ???? ?????. ??? ??? ??? ??? ??????? ???? ?? ??? ??? ???? ?? ???? ?? ? ???? ???. ?: 1. ?????? ?? ?? ???? ??????. ??? ??? ??, ??? ??? ?? ??????? ??? PHP? ?? ??? ??? ??? ???? ???. 2. ??????? ?? ??/?? ?? ?? ?? ??????? ???? ??? PHP? ?????? ??? ???? ?? ????? ?? ???? ??? ?? ??? ?????. ?? ???? ??? ?? ??????? ???? ??? ?? ??? ??? ?????. ???? ?? ?? ?? ?? ?????? ?? ??????? ?? ??? ???? ??? ? ?? ??? ???? ?? ?? ? ???? ?? ??? ???????. ?? ??? ?? ??? ????. 1 ???? ??? ?? ??, ??? ? ??? ?? ??? ??? ? ?????. ??. ?? ?? ? AB? ??? AB? ?????. 2. ?? ????? ?? ??? ???? ??(??? ????? ?? ??)? ?? ???? ??? ?? ??? ??? ?????. ?? ?? ?????? ABC? C? ??? ?? CDe()? ?? ??? ABCDe()? ?????. 3. ?????? ??? ???? ??? ?? ???? ?? ?? ???? ?? ??? ?? ?????? ??? ?????. ?? ??, CDe()? ?????? AB ??? ???? CDe()? ABCDe()? ?????. 4. ????? ?? ??? ??? ?? ???? ??? ?? ??? ??? ?????(?? ???? ?? ?? ?? ??? ???). ?? ?? ?????? ABC? C? ??? ?? new C()? new ABC()? ?????. 5. ??????(?: AB) ??? ????? ?? ??? ?? ?? ??? ???? ?????. ?? ?? foo() ??? ?? ??? ??? ?? ?? ?????. 1. ?? ???????? ABfoo()?? ??? ????. 2 ?? ?? foo? ?? ??? ???. () ????. 6. ??????(?: AB) ??? ????? ?? ?? ?? ???? ?? ???(??? ????? ?? ??)? ?? ??? ???? ?????. new C()? new DE()? ???? ?? ?? ??? ??? ????. new C() ?? ??: 1. ?? ???????? ABC ???? ????. 2. ABC ???? ???? ??? ???. ? DE() ??: 3. ??? ?? ?? ?? ?????? ??? ???? ABDE? ??? ? ?? ???? ?????. 4. ABDE ???? ???? ??? ???. ??? ???????? ??? ???? ????? ???? ??? new C()? ???? ???. <?php
namespace Foo\Bar\subnamespace;
const FOO = 1;
function foo() {}
class foo
{
static function staticmethod() {}
}
?>
<?php
namespace Foo\Bar;
include 'file1.php';
const FOO = 2;
function foo() {}
class foo
{
static function staticmethod() {}
}
/* 非限定名稱 */
foo(); // 解析為 Foo\Bar\foo resolves to function Foo\Bar\foo
foo::staticmethod(); // 解析為類 Foo\Bar\foo的靜態(tài)方法staticmethod。resolves to class Foo\Bar\foo, method staticmethod
echo FOO; // resolves to constant Foo\Bar\FOO
/* 限定名稱 */
subnamespace\foo(); // 解析為函數(shù) Foo\Bar\subnamespace\foo
subnamespace\foo::staticmethod(); // 解析為類 Foo\Bar\subnamespace\foo,
// 以及類的方法 staticmethod
echo subnamespace\FOO; // 解析為常量 Foo\Bar\subnamespace\FOO
/* 完全限定名稱 */
\Foo\Bar\foo(); // 解析為函數(shù) Foo\Bar\foo
\Foo\Bar\foo::staticmethod(); // 解析為類 Foo\Bar\foo, 以及類的方法 staticmethod
echo \Foo\Bar\FOO; // 解析為常量 Foo\Bar\FOO
?>
<?php
namespace Foo;
function strlen() {}
const INI_ALL = 3;
class Exception {}
$a = \strlen('hi'); // 調(diào)用全局函數(shù)strlen
$b = \INI_ALL; // 訪問全局常量 INI_ALL
$c = new \Exception('error'); // 實(shí)例化全局類 Exception
?>
<?php
class classname
{
function __construct()
{
echo __METHOD__,"\n";
}
}
function funcname()
{
echo __FUNCTION__,"\n";
}
const constname = "global";
$a = 'classname';
$obj = new $a; // prints classname::__construct
$b = 'funcname';
$b(); // prints funcname
echo constant('constname'), "\n"; // prints global
?>
<?php
namespace namespacename;
class classname
{
function __construct()
{
echo __METHOD__,"\n";
}
}
function funcname()
{
echo __FUNCTION__,"\n";
}
const constname = "namespaced";
include 'example1.php';
$a = 'classname';
$obj = new $a; // prints classname::__construct
$b = 'funcname';
$b(); // prints funcname
echo constant('constname'), "\n"; // prints global
/* note that if using double quotes, "\namespacename\classname" must be used */
$a = '\namespacename\classname';
$obj = new $a; // prints namespacename\classname::__construct
$a = 'namespacename\classname';
$obj = new $a; // also prints namespacename\classname::__construct
$b = 'namespacename\funcname';
$b(); // prints namespacename\funcname
$b = '\namespacename\funcname';
$b(); // also prints namespacename\funcname
echo constant('\namespacename\constname'), "\n"; // prints namespaced
echo constant('namespacename\constname'), "\n"; // also prints namespaced
?>
<?php
namespace MyProject;
header("Content-type:text/html;charset=utf-8"); //設(shè)置編碼
echo '"', __NAMESPACE__, '"'; // 輸出 "MyProject"
?>
<?php
header("Content-type:text/html;charset=utf-8"); //設(shè)置編碼
echo '"', __NAMESPACE__, '"'; // 輸出 "MyProject"
?>
<?php
namespace MyProject;
function get($classname)
{
$a = __NAMESPACE__ . '\' . $classname;
return new $a;
}
?>
<?php
namespace MyProject;
use blah\blah as mine; // see "Using namespaces: importing/aliasing"
blah\mine(); // calls function blah\blah\mine()
namespace\blah\mine(); // calls function MyProject\blah\mine()
namespace\func(); // calls function MyProject\func()
namespace\sub\func(); // calls function MyProject\sub\func()
namespace\cname::method(); // calls static method "method" of class MyProject\cname
$a = new namespace\sub\cname(); // instantiates object of class MyProject\sub\cname
$b = namespace\CONSTANT; // assigns value of constant MyProject\CONSTANT to $b
?>
<?php
namespace\func(); // calls function func()
namespace\sub\func(); // calls function sub\func()
namespace\cname::method(); // calls static method "method" of class cname
$a = new namespace\sub\cname(); // instantiates object of class sub\cname
$b = namespace\CONSTANT; // assigns value of constant CONSTANT to $b
?>
<?php
namespace foo;
use My\Full\Classname as Another;
// 下面的例子與 use My\Full\NSname as NSname 相同
use My\Full\NSname;
// 導(dǎo)入一個(gè)全局類
use \ArrayObject;
$obj = new namespace\Another; // 實(shí)例化 foo\Another 對(duì)象
$obj = new Another; // 實(shí)例化 My\Full\Classname 對(duì)象
NSname\subns\func(); // 調(diào)用函數(shù) My\Full\NSname\subns\func
$a = new ArrayObject(array(1)); // 實(shí)例化 ArrayObject 對(duì)象
// 如果不使用 "use \ArrayObject" ,則實(shí)例化一個(gè) foo\ArrayObject 對(duì)象
?>
<?php
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another; // 實(shí)例化 My\Full\Classname 對(duì)象
NSname\subns\func(); // 調(diào)用函數(shù) My\Full\NSname\subns\func
?>
<?php
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another; // 實(shí)例化一個(gè) My\Full\Classname 對(duì)象
$a = 'Another';
$obj = new $a; // 實(shí)際化一個(gè) Another 對(duì)象
?>
<?php
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another; // instantiates object of class My\Full\Classname
$obj = new \Another; // instantiates object of class Another
$obj = new Another\thing; // instantiates object of class My\Full\Classname\thing
$obj = new \Another\thing; // instantiates object of class Another\thing
?>
<?php
namespace A\B\C;
class Exception extends \Exception {}
$a = new Exception('hi'); // $a 是類 A\B\C\Exception 的一個(gè)對(duì)象
$b = new \Exception('hi'); // $b 是類 Exception 的一個(gè)對(duì)象
$c = new ArrayObject; // 致命錯(cuò)誤, 找不到 A\B\C\ArrayObject 類
?>
<?php
namespace A\B\C;
const E_ERROR = 45;
function strlen($str)
{
return \strlen($str) - 1;
}
echo E_ERROR, "\n"; // 輸出 "45"
echo INI_ALL, "\n"; // 輸出 "7" - 使用全局常量 INI_ALL
echo strlen('hi'), "\n"; // 輸出 "1"
if (is_array('hi')) { // 輸出 "is not array"
echo "is array\n";
} else {
echo "is not array\n";
}
?>
<?php
namespace A\B\C;
/* 這個(gè)函數(shù)是 A\B\C\fopen */
function fopen() {
/* ... */
$f = \fopen(...); // 調(diào)用全局的fopen函數(shù)
return $f;
}
?>