首页vns威尼斯城官网登入 › 在PHP中也存在命名空间的用法vns威尼斯城官网登入,静态属性则是用

在PHP中也存在命名空间的用法vns威尼斯城官网登入,静态属性则是用

PHP中的命名空间

PHP从5.3版本开端引进了命名空间,之后超级多存活PHP类库以致框架都从头帮忙它。那么PHP的命名空间怎么用啊?

同个文件下得以存在多少个命名空间; 不相同命名空间内的类能够相互调用。

实现(implements)

要实现三个接口,使用 implements
操作符。类中必得兑现接口中定义的全体办法,不然会报三个沉重错误。
类可以兑现五个接口,用逗号来分隔七个接口的称谓。

取名空间最首即便为着解决代码中类和函数也许存在冲突的难题,而以此性情别的语言一早原来就有,PHP则是缓不济急,它的产出催生了
PS帕杰罗-4 的落榜,进而也催生了 Composer 的勃兴,所以是足够关键的表征。

命名空间

如何是命名空间吗?

取名空间(朝鲜语:Namespace)表示标记符(identifier)的可以预知范围。七个标记符可在八个命名空间中定义,它在差异命名空间中的含义是互不相干的。那样,在四个新的命名空间中可定义任何标记符,它们不会与其余已部分标记符爆发冲突,因为已有个别定义都远在其余命名空间中。

轻巧易行说来定名空间是为了减轻分歧库在同三个遭遇下选用时现身的命名冲突。举个例子作者要好有叁个函数名称为A,然而系统现原来就有三个A函数了,那就能产出冲突。

概念后的命名空间能够用_​_​NAMESPACE_​_​法力变量来赢妥贴前命名空间。

命名空间

  1. 解决PHP内部的类、函数、常量或第三方类、函数、常量之间的名字冲突。
  2. 为很短的标记名称创造一个小名,提升源代码的可读性。

<?phpnamespace my\name;class MyClass{}function myfunction(){}const MYCONST = 1;$a = new MyClass();$c = new \my\name\MyClass;$a = strlen('hi');$d = namespace\MYCONST;$d = __NAMESPACE__ . '\MYCONST';echo $d;echo constant($d);

导入,别名

假如要选取的命名空间层级不短且数量众多,那么在运用的时候特意麻烦,所以能够行使
use
关键字导入命名空间、类、常量、函数等,然后能够选择它们一直引用完整的名号。而
alias 关键字能够给导入的类和函数等重命名。

例如怎么样行使 use 关键字,该代码处于大局命名空间之下:

include 'function.php';

use Foo\Bar\subnamespace\foo ;
$obj = new foo;
echo $obj->foofunction();

use Foo\Bar\subnamespace\foo  as aliasfunname;
$obj = new aliasfunname;
echo $obj->foofunction();

use Foo\Bar\subnamespace ; 
$obj = new subnamespace\foo ;
echo $obj->foofunction();

use Foo\Bar\subnamespace  as aliasname;
$obj = new aliasname\foo ;
echo $obj->foofunction();

//由于调用代码并不在命名空间内,所以对于全局的类,无需引入使用
$obj = new ArrayObject(array(1)); 

//导入一个函数
use function Foo\Bar\subnamespace\foo   ;
echo foo();

use function Foo\Bar\subnamespace\foo  as func;
echo func();

use const  Foo\Bar\subnamespace\FOO;
//echo FOO;

总结:

  • 和 Python 不相同样,PHP
    中的命名空间是语义上的一种概念,和现实代码的职位、布局尚未涉及,换句话说,使用命名空间的代码须要团结引进库文件(全部文件),至于库文件怎样组织不在乎;而在
    Python 中,假诺模块或包中有一个 __init__.py 文件,则 Python
    解析器会活动引进包或有所模块的文书。
  • PHP
    中功效域的定义很弱化,全局域和部分域分的很明亮,举例在函数或类中不可能援引全局空间中的变量。而在命名空间则区别,定义命名空间的代码,要是找不到对应命名空间下的常量和函数,则会使用全局的常量和函数;而只要找不到对应名命名空间下的类(包罗自定义类),则代码直接报错。
  • 透过 use 关键字选取命名空间的,无须通过一丝一毫约束名称的点子(\
    符号)导入,因为 PHP 已经假如导入的是截然约束的命名空间。
  • 因而 use 关键字能够导入常量、函数、类、接口、别的命名空间。
  • 取名空间是一种语言特征,为了追求更使得的运用,应该有一种采纳标准和电动加运载飞机制,那就是PS传祺-4 标准。

自行加载

每种文件既要注解命名控件又要手动include是卓殊不智能的业务,所以在和煦的PHP系统可能框架中可以应用机动加载本领,让系统和煦去找

最简易的必须要经过的路是应用函数__autoload函数,不过那几个函数只好在非命名控件下定义,也正是全局情形下:

function __autoload($class) {
  $dir = './';
  set_include_path(get_include_path().PATH_SEPARATOR.$ids_dir);
  $class = str_replace('\\', '/', $class) . '.php'; 
  require_once($class); }

一经在早原来就有了命名空间的类中,能够运用函数spl_autoload_register来注册一个类中的方法来取代__autoload

举个例子,文件目录a/b/c下有d.php,则在a目录下的的公文引进d的类时,应该是use
b/c或use /a/b/c;

概念命名空间

虽说大肆合法的PHP代码都足以满含在命名空间中,但独有以下项目标代码受命名空间的熏陶,它们是:

类、接口、函数和常量。

命名空间通过重大字namespace来声称。借使二个文本中蕴藏命名空间,它必需在此外轮代理公司码以前宣称命名空间,
有三个除了:declare关键字。

<?phpnamespace space\MyProject;const CONNECT_OK = 1;class Connection{}function connect(){}echo __NAMESPACE__;

引用命名空间标记符的三种办法

(1)Fully-qualified name

相近于操作系统上的相对路线,而且是欧洲经济共同体的路径,所以在知情的时候不会有误解。
比如在 new \A\B\C ,那么 C 就被会深入分析到 A\B 命名空间下的 C 类。

(2)Qualified name

相近于操作系统上的相对路线,它含有部分名字并被引述到当下的命名空间。
比如 B\C(卡塔尔国 在命名空间 A 下调用,则末了援用的命名空间就是 A\B\C()。

(3)Unqualified name

肖似于Qualified name,可是没包蕴子命名空间。
比方说 C(State of Qatar 在命名空间 A\B 下调用,则最后援用的命名空间就是 A\B\C()。

由此多少个例证来注脚二种引用形式:

namespace \Example;
require_once "fnction.php";
class ClassA {}
function Function() {}

//完全限定名称
\Example\Function();
\Example\B\Function(); 

//限定名称
B\Function(); //指向 \Example\B\Function();

//非限定名称
$test = new ClassA(); //resolves to \Example\ClassA
Function(); //指向 \Example\Function

注意:

  • Inside a namespace,假使在 current scope
    未有察觉函数和常量的定义,PHP 不会报错。而是去全局命名空间中检索。
  • Inside a namespace,假设在 current scope 未有开采类的定义,则 PHP
    会直接报错,不会去全局域中找对应的类,所以即便你要求引用多个internal 或客户自定义的类,必得运用完全约束名称。

先举个简单的事例,首先编写一段代码(定义在命名空间下),命名叫function.php :

namespace Foo\Bar\subnamespace;
const FOO = 1;
function foo() 
{
    return "foo\r\n";
}
class foo 
{
    static function staticmethod()
    {
        return __METHOD__ . "\r\n" ;
    }

    function foofunction()
    {
        return __METHOD__ . "\r\n" ;
    }
}

再编辑一段代码 test.php,也是处在命名空间之下的代码:

namespace secondsp;
include 'function.php';

class foo
{
    function foofunction()
    {
        return __METHOD__ . "\r\n" ;
    }
}

function is_file($file)
{
    return true ;
}

//非限定名称:实例化secondsp\foo类对象
$obj = new foo;  
echo $obj->foofunction();

//实例化Foo\Bar\subnamespace\foo 类对象
$obj = new Foo\Bar\subnamespace\foo ;
echo $obj->foofunction();

//代码会报错,在命名空间内部,假如无法找到当前命名空间下的类,则会报错
//$obj = new ArrayObject(array(1)); 
$obj = new \ArrayObject(array(1)); 

//在命名空间内部,假如无法找到当前命名空间下的函数或者常量,则会寻找 native function
echo  strlen("nihao");

 //引用当前命名空间下的函数
var_dump(is_file('nihao')); //True
//引用全局函数
var_dump(\is_file('nihao')); //False

利用命名空间

运用命名空间的章程如下:

<?php 
namespace B;
use A;

const test = 'Btest';
function test() { 
    return __FUNCTION__; 
}

class Test{
    public function __construct(){
        return __METHOD__;
    }
}

include "a.php";//必须包含A命名空间的文件

// 完全限定
// `\B\test`从绝对位置查找输出,如果是全局函数则`\test`
echo \B\test;   //输出Btest

// 限定名称  
// 这里已经通过`use A`申明了在这个文件可以通过`\A\...`使用A命名空间的函数
echo A\test;    //输出Atest

// 非限定名称
// 非限定名称的函数`test`会从当前命名控件查找,即B
echo test;      //输出Btest

// namespace关键字代表当前命名空间
echo namespace/test;
?>

首先要留意的是命名空间只起评释功能,也正是在应用了命名空间的时候依旧得把那么些命名空间申明的不胜文件满含进来。在运用中能够通过__NAMESPACE__来查看当前定名空间。

更加多内容能够查阅PHP官方文书档案

更加多关于PHP相关内容感兴趣的读者可查看本站专项论题:《php面向对象程序设计入门教程》、《PHP基本语法入门教程》、《PHP运算与运算符用法统计》、《PHP互连网编制程序手艺总括》、《PHP数组操作本领大全》、《php字符串用法计算》、《php+mysql数据库操作入门教程》及《php置之不理数据库操作能力汇总》

php如何运用类

class myclass{    //成员变量    public $myvar;    //构造函数    function __construct($myvar){        $this->myvar = $myvar;    }    //封装    function setValue($myvar){        $this->myvar = $myvar;    }    function getValue(){        return $this->myvar;    }    //析构函数    function __destruct(){        unset($this->myvar);    }}//类继承class myextends extends myclass{}$myclass = new myextends("Moments");echo $myclass->getValue();
  • 怎么样采取静态变量

class myclass{    //使用静态变量    public static $myvar = "Moments";    public function myfun(){        return self::$myvar;    }}$myclass = new myclass();echo myclass::$myvar;echo $myclass->myfun();        
  • 哪些利用抽象类

abstract class myclass{    public $myvar;    //强制要求子类定义之些方法    abstract protected function setValue($myvar);    //普通方法    public function getValue(){        return $this->myvar;    }}class myextends extends myclass{    function setValue($myvar){        $this->myvar = $myvar;    }    function getValue(){        return parent::getValue();    }}$myclass = new myextends();$myclass->setValue("Moments");echo $myclass->getValue();      
  • 怎么样行使对象接口

#接口中定义的所有方法都必须是公有interface myinterface{    //接口不支持成员变量,可以使用常量    const myconst = "myconst";    //类中必须实现接口中定义的所有方法。    public function setValue($myvar);    public function getValue();}class myextends implements myinterface{    public function setValue($myvar){        $this->myvar = $myvar;    }    public function getValue(){        return $this->myvar;    }}$myclass = new myextends();$myclass->setValue("Moments");echo $myclass->getValue();echo myinterface::myconst;

命名空间的概念

命名空间是一个器皿,这么些容器首假如为了鉴定识别其下的类和函数。一旦定义了命名空间,它上面包车型大巴代码就归属那一个命名空间了,所以命名空间的定义要在代码的最最早行。

对此同三个包的话,同二个命名空间依旧子命名空间的代码不须要在多个 PHP
文件中定义,子命名空间下的代码是为了做到一定模块的干活,组合起来正是两个包完整的命名空间。

假若编写的代码未有概念命名空间,那表明它归属全局的命名空间(\
符号),所以能够一贯援用类大概函数(不用增多 \ 符号)。

概念命名空间

下边是二个定义命名空间的例证

<?php    
//file a.php
namespace A;

const test = 'Atest'; 

function test() { 
    return __FUNCTION__; 
}

class Test{
    public function __construct(){
        return __METHOD__;
    }
}
?>

地点例子中便是一个一级的命名空间定义方法,仅有constfunction,class受命名空间的自律。

1、代码复用类Trait也切合命名空间的标准,即由此命名空间下Trait类不能够重名;2、纵然PSEnclave4规定了命名空间路线与公事路线需求相对应,但是运转php时命名空间路线与公事路线是一向不别的关系的,举个例子a/b/c下的公文类d,命名空间能够写成a1/b1/c1/d;只可是未来的众多开源框架在落实类活动加载的时候把互相标准为相像,不然会冒出类公事加载到了,可是命名空间却加载不到的动静。3、在命名空间内部,全数的从没有过遵照导入法则转变的约束名称均会在其眼下加受愚前的命名空间名称。举个例子,在命名空间A\B内部调用C\D\e会被撤换为A\B\C\D\e,对非限制名称的函数调用是在运营时剖判的。比方对函数foo在当下定名空间中查找名称叫A\B\foo尝试查找并调用全局。5、在命名空间内部对非约束名称或约束名称类的调用是在运行时剖析的。下边是调用new
C的深入分析进程:new C在当前定名空间中查找A\B\C类。尝试自动装载类A\B\C。

末尾静态绑定

自 PHP 5.3.0 起,PHP
增添了叁个名字为早先时期静态绑定的作用,用于在继续范围内援引静态调用的类。

前言

Final 关键字

PHP 5 新添了三个 final 关键字。假设父类中的方法被声称为
final,则子类无法隐讳该措施。 若是八个类被声称为 final,则无法被三翻五次。

<?phpclass BaseClass{    public function display()    {        echo 'final';    }    final public function test()    {        echo 'Hello World!';    }}class A extends BaseClass{    public function display()    {        echo 'A';    }    public function test()    {        echo 'haha';    }}$temp = new A();$temp->test();#会报错,final方法不能重写

则该命名空间下的类都归于于该命名空间,example命名空间下的类无法重名。

抽象类

其余一个类,要是它个中足足有叁个方式是被声称为架空的,那么这么些类就不得不被声称为架空的。

<?phpabstract class AbstractClass{ // 强制要求子类定义这些方法    abstract protected function getValue();    abstract protected function prefixValue($prefix);    // 普通方法    public function printOut() {        print $this->getValue() . "\n";    }}class ConcreteClass1 extends AbstractClass{    protected function getValue() {        return "ConcreteClass1";    }    public function prefixValue($prefix) {        return "{$prefix}ConcreteClass1";    }}class ConcreteClass2 extends AbstractClass{    public function getValue() {        return "ConcreteClass2";    }    public function prefixValue($prefix) {        return "{$prefix}ConcreteClass2";    }}$class1 = new ConcreteClass1;$class1->printOut();echo $class1->prefixValue('FOO_') ."\n";$class2 = new ConcreteClass2;$class2->printOut();echo $class2->prefixValue('FOO_') ."\n";?>

取名空间的概念采取关键字namespace,定义情势如下:

生成器

生成器提供了一种更易于的章程来兑现简单的靶子迭代,相比较定义类完成Iterator接口的措施,质量开支和错综相连大大收缩。

生成器允许你在foreach代码块中写代码来迭代一组数据而无需在内存中开创八个数组,在内部存款和储蓄器中创制一个大数组可能会令你的内存达到上限,也许会驱除可观的处理时间。

生成器函数,就好像二个通常的自定义函数同样,和多如牛毛函数只回去三次分歧的是,生成器能够遵照需求yield数十次,以便生成须求迭代的值。

叁个简单的事例就是利用生成器来再度达成 range(State of Qatar 函数。 规范的 range(卡塔尔(قطر‎函数须要在内部存款和储蓄器中生成贰个数组富含每二个在它界定内的值, 然后重返该数组,
结果正是会发生多个一点都不小的数组。 比如,调用 range(0, 1000000卡塔尔将导致内部存款和储蓄器占用超越 100 MB。

<?phpfunction xrange($start, $end, $step = 1){    for ($i = $start; $i <= $end; $i += $step)    {        yield $i;    }}// 直接报500错误foreach (range(0, 1000000) as $val){    echo $val;}// 进入大循环foreach (xrange(0, 1000000) as $val){    echo $val;}
use example;use example\test\demo;$class = new a();//实例化example命名空间下的a类$class = new b(); //实例化example\test\demo命名空间下的b类

case 实例

  1. php面试题笔记
  2. pythonLogo提取
  3. 字幕乱码难点
  4. 支付宝接口调用
  5. laravel开辟笔记
namespace example\test\demo as testDemo;

frame 框架

  1. laravel入门
  2. dingo入门
  3. JWT入门
  4. Laravel框架关键本事分析
  5. laravel则修笔记
  6. rpc入门
  7. rabbitmq入门
  8. opencc多国语言
  9. laravel兄弟连笔记
  10. laravel进阶

故此基于官方所说,在PHP中,命名空间用来解决在编排类库或应用程序时创立可采取的代码如类或函数时遇到的两类主题材料:

Trait代码复用

<?phpclass A{    public function sayHello()    {        echo "Hello ";    }}trait mytrait{    public function traitFunction()    {        parent::sayHello();        echo "world!";    }}class B extends A{    use mytrait;}$temp = new B();$temp->traitFunction();

3、实例化

基本概念

每种类的概念都以最主要class开始。

<?phpnamespace NS{    class A    {        // 成员属性        public $temp = '成员属性';        // 方法        public function displayVar()        {            // 使用伪变量$this调用成员属性            echo $this->temp . "<br>";        }    }// 使用new关键字实例化一个类    $temp = new A();    echo $temp->displayVar();    class B extends A    {        // 构造方法        function __construct()        {            $this->temp = '成员属性B继承于A';        }    }    $temp = new B();    echo $temp->displayVar();    echo A::class;}?>

是因为措施、类在分歧体系中命名空间定义不相通,第三方类库的命名空间也定义不相似,所以相关php协会出面了一套风靡一时的正规化,即PS君越4标准,

类与对象

从广义上的话,命名空间是一种包装事物的章程。在数不胜数地点都足以见见这种抽象概念。举例PHP的类名是不得以重新的,但是常常我们需求引进一些第三方的类库,日常类名就能够在等级次序中发生重复冲突,所以,命名空间就是除恶务尽那几个矛盾的一种艺术。

衿华客

转载本站文章请注明出处:vns威尼斯城官网登入 http://www.tiec-ccpittj.com/?p=5248

上一篇:

下一篇:

相关文章