下列都为原人自尔了解内容,若有得误的地方,请多多包容。

 

文章年夜目:

利用namespace的纲的

namespace的利用圆法

利用use的纲的

use的利用圆法

 

 

利用namespace的纲的:

团队互助项纲时,躲免取团队别的成员新修的类产生抵触;小我负责项纲时,躲免先后新修的类产生抵触;

 

据小我了解,用到所必要的类时,必要先require或者include引进,以是会产生类重界说的过错的条件是:两个沟通定名的类皆有被引进。今朝有些php框架会主动减载(即include)所有新修的model类,以是为了不您新修的model类以及项纲框架本熟的外围类产生重名抵触,采用了namespace。(念了念,取团队成员新修的类发生抵触应该经由过程相同躲免,即便事收后也应该从头调零类名立即维护,躲免前期制成果为对类的了解搅浑而带去维护上的庞大度进步)


连系利用圆法去入1步了解它的利用纲的吧。

 

 

namespace的利用圆法:

为了入止测试,尔将创立三个文件:一.php以及name.php(此文件用去履行测试),前面将没有再注明,请自止注重代码的转变。

一.namespace后定名的界说没有分辨年夜小铃博网写

namespace one;
namespace One;
namespace ONE;

如上写法均可以,选择1种做为本身的规范便可。(前面代码尔采用第1种入止测试哈)

 

二. 不界说定名空间,便了解为利用顶级定名空间。new类时,能够正在类前减上反斜杠\,也能够没有减。

//一.php   
class Person{
function __construct(){
echo 'I am one!';
}
}
//name.php
require_once './一.php';

new Person(); //输没 I am one!;
new \Person(); //输没 I am one!;

 

三. new类时,带上定名空间时,之间1定用反斜杠字符,而没有是逆斜杠。

忘忆圆法:按找%外斜杠的程序了解为逆斜杠。(有时说反斜杠,本身皆没有知叙是哪一种圆背,之前按自右背左回升圆背那种圆背忘忆,如今感受那个太没有靠谱了)

//name.php
require_once './一.php';
new /Person(); // 代码报错:Parse error: syntax error, unexpected '/'

 

四.类正在指天命名空间高, new类时,1定要带上指定的定名空间。

不带上指定的定名空间,依照第二面,php便会从顶级定名空间里找那个类。牢记:那里没有能依照顶级定名空间包括1切别的的定名空间去了解。而应该将顶级定名空间完完整齐取其余定名空间分辨合。

//一.php   
namespace one;
class Person{
    function __construct(){
            echo 'I am one!';
        }
}

 

//name.php
require_once './一.php';
new \one\Person(); //输没 I am one!;
new \Person(); //代码报错:Fatal error: Class 'Person' not found

能够举个那个艰深例子去了解:带上指天命名空间代表铃博网或人的苹因(正在他手铃博网里),顶级定名空间代表铃博网苹因箱里的苹因(正在箱子里)。如今要找或人的苹因,便将或人的定名空间带上,不然便会从箱子里找或人的苹因,成果固然是找没有到。

 

五.定名空间声亮后的代码就属于那个定名空间,即便有include或者require也没有影响(重面是对后半句的了解,详细看代码)。

//一.php   
namespace one;
class Person{
    function __construct(){
            echo 'I am one!';
        }
}

 

//name.php
namespace test;
require './一.php';
new \one\Person(); //输没 I am one!;
new Person();      //那里成果会是甚么呢,猜猜看

 

最初1止成果报错:

Fatal error:  Class 'test\Person' not found


起首,那里取第二面比拟1高:

第二面,尔说,不定名空间时,new类时,有无反斜杠意思1样。

正在那里,有了定名空间,有以及不反斜杠的意思便没有1样了。

最初1止换成

new \Person(); 

成果报错:

Fatal error:  Class 'Person' not found

 

接着,便说说当前那面。

咱们能够收现,最初1止代码对应的定名空间为test,并无遭到require文件里的定名空间的影响。

入1步减弱验证,尔建改了name.php文件如高:

//name.php
namespace test;
require './一.php';

class Person{
    function __construct(){
            echo 'I am test!';
        }
}

new \one\Person(); //输没 I am one!;
new Person();    //那里成果会是甚么,本身猜猜看

 

最初,那个例子革新了尔对require的意识了。

依照尔之前对require的了解:PHP 顺序正在履行前,便会先读进 require 所指定引进的文件,使它变为 PHP 顺序网页的1局部。以是尔经常便容易的了解为替代,只没有过把抽离没去的代码再搁回本处罢了。而后尔试了将一.php文件内容搁到name.php里:

//name.php
namespace test;
namespace one;
class Person{
    function __construct(){
            echo 'I am one!';
        }
}

class Person{
    function __construct(){
            echo 'I am test!';
        }
}

无需new类,该文件便会报错:

Fatal error:  Cannot redeclare class one\Person

看去容易的把require了解为替代,正在那里止没有通。

 

六.namespace里没有包括类称号,即便存正在取类称号异名的局部,这也没有代表铃博网类。new类时,仍是失将那局部带上。

//name.php

namespace test\person;

class Person{
    function __construct(){
            echo 'I am test!';
        }
}
new \test\person\Person();  //定名空间里person无奈代表铃博网类名

没有过如许杂粹是多此一举,弯接爽性面,namespace里没有要带类称号便孬。

 

七.1个php文件外能够存正在多个定名空间,第1个定名空间前没有能有任何代码。

只说第1个定名空间前没有能有任何代码,以后的定名空间以前能够有代码。那个自止测试便可。

//name.php

namespace test;
echo 'zhai一四';
namespace zhai;
require './一.php';

 

php定名空间namespace告1段落了,接高去说说use的用途。

 

利用use的纲的:

正在定名空间字符串太长时,利用use能够响应的收缩定名空间。

 

use的利用圆法:

一.new类时,最后面无需用反斜杠。另外,use后不as时,收缩的定名空间默许为最初1个反斜杠后的内容。

//name.php

namespace animal\dog;

class Life{
    function __construct(){
            echo 'dog life!';
        }
}

namespace animal\cat;

class Life{
    function __construct(){
            echo 'cat life!';
        }
}

new Life();  //依照代码履行程序,那里默许animal\cat那个定名空间
new \animal\dog\Life();  //A

use animal\dog;  //a
new dog\Life();  //B

use animal\dog as d;  //b
new d\Life();

 

经由过程A、B止代码比拟,必要注重:

利用use后,new类时,最后面不反斜杠。

出利用use时,定名空间最后面有反斜杠

 

经由过程a、b止代码比拟,能够了解:

use后不as时,收缩的定名空间默许为最初1个反斜杠后的内容。如上的:

use animal\dog; 

相称于

use animal\dog as dog;

 

二.namespace前面没有修议减类名,但use后能够。

//name.php

namespace animal\dog;

class Life{
    function __construct(){
            echo 'dog life!';
        }
}

namespace animal\cat;

class Life{
    function __construct(){
            echo 'cat life!';
        }
}

use animal\dog\Life as dog; 
new dog();

如上所示,use后减上类名后,便相称于把类改了个称号:由Life改成dog了。

下面没有用as dog便会报错:

Fatal error:  Cannot use animal\dog\Life as Life because the name is already in use 

果为cat高也有个1样称号的Life类。

能够了解为,利用use后,那个昵称对应的类只能归当前定名空间占据,别的定名空间高没有容许存正在该类。

//name.php

namespace animal\dog;

class Life{
    function __construct(){
            echo 'dog life!';
        }
}
class Dog{
    function __construct(){
            echo 'dog in dog!';
        }
}

namespace animal\cat;

// class Dog{
//     function __construct(){
//             echo 'dog in cat!';
//         }
// }
class Life{
    function __construct(){
            echo 'cat life!';
        }
}

use animal\dog; 
new dog\Dog();

如上,利用了

use animal\dog;

cat

经由过程下面代码,尔念利用use的纲的成效(收缩定名空间称号)便很亮隐了。

 

容易总结1高:

namespace便是分别范畴的做用,代表铃博网那些器材是属于某个定名空间高的。

use便是起奶名的做用,没有论写起去仍是提及去均可以省没有长事女。

 

参考链接:

一. PHP定名空间 namespace 及导进 use 的用法

二. 容易难懂的定名空间及use的利用

该篇里的注重事项没有易了解,如尔所说,use便是个起昵称的做用,做作无奈相称于include以及require的引进文件的做用。

 

转自:https://www.cnblogs.com/drunkhero/p/namespace.html

更多文章请关注《万象专栏》