PHP命名空间及自动加载浅析,PHP进阶学习之命名空间基本用法分析_php技巧_脚本之家

命名空间

什么样是命名空间吧?

取名空间(Turkey语:Namespace)表示标记符(identifier)的可以见到范围。一个标志符可在八个命名空间中定义,它在分歧命名空间中的含义是互不相干的。这样,在四个新的命名空间中可定义任何标记符,它们不会与任何原来就有个别标志符暴发冲突,因为本来就有的定义都地处别的命名空间中。

简轻便单说来定名空间是为了死灭区别库在同三个景况下行使时现身的命名冲突。比如小编自个儿有八个函数名为A,可是系统已经有一个A函数了,那就能够并发冲突。

在先后中实例化并利用有个别命名空间下的类措施,相通应用new关键字张开实例化,但是急需在类名前面加上命名空间前缀。

yield关键字

生成器函数的中坚便是yield关键字。它最简便的调用方式看起来像三个return评释,不一样之处在于通常return会重临值并
终止函数的试行,而yield会重临叁个值给循环调用此生成器的代码并且只是暂停实践生成器函数。

<?php

function test()
{
    for ($i = 0; $i <= 10; $i++)
    {
        // 注意:变量$i的值在不同的yield之间是保持传递的。
        yield $i;
    }
}

$temp = test();
foreach ($temp as $value)
{
    echo "$value" . "<br>";
}

使用命名空间

利用命名空间的方法如下:

<?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官方文书档案

在用namespace定义命名空间的时候,为了制止以往引用的时等待命令名空间过长,能够在概念时利用as关键字为三个命名空间钦定别称

布局函数

<?php
class BaseClass {
   function __construct() {
       print "In BaseClass constructor\n";
   }
}

class SubClass extends BaseClass {
   function __construct() {
       parent::__construct();
       print "In SubClass constructor\n";
   }
}

class OtherSubClass extends BaseClass {
    // inherits BaseClass's constructor
}

// In BaseClass constructor
$obj = new BaseClass();

// In BaseClass constructor
// In SubClass constructor
$obj = new SubClass();

// In BaseClass constructor
$obj = new OtherSubClass();
?>

概念命名空间

下边是三个定义命名空间的事例

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

const test = 'Atest'; 

function test() { 
    return __FUNCTION__; 
}

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

地方例子中便是叁个卓越的命名空间定义方法,唯有constfunction,class受命名空间的限制。

1、客户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。2、为非常长的标志符名称创制三个别名的名目,提升源代码的可读性。

目的接口

动用接口(interface),能够钦点有些类必需兑现怎么着措施,但不必要定义那些方法的具体内容。

接口是通过 interface
关键字来定义的,仿佛定义三个专门的学业的类同样,但里面定义全体的艺术都是空的。

接口中定义的富有办法都必须要是国有,那是接口的特色。

PHP中的命名空间

PHP从5.3本子最早引进了命名空间,之后好些个共处PHP类库以致框架都起来帮衬它。那么PHP的命名空间怎么用吧?

在PHP中也设有命名空间的用法,由它决定可以知道范围的那么些标记符日常指的正是类和函数。

server 环境

  1. ubuntu入门
  2. docker入门
  3. git入门
  4. iterm入门

活动加载

每一个文件既要申明命名控件又要手动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

  1. 叁个整机的类名需具备以下布局:

采纳命名空间:后备全局函数/常量

在三个命名空间中,当PHP遭受三个非限制的类、函数或常量名称时,它使用不一致的预先政策来深入分析该名称。

类名称总是深入解析到当前命名空间中的名称。由此在访问系统之中或不分包在命名空间中的类名称时,必得选用完全约束名称。

对于函数和常量来讲,若是当前定名空间中不设有该函数或常量,PHP会退而选取全局空间中的函数或常量。

<?php

namespace A\B\C;

class Exception extends \Exception
{
}

$a = new Exception('message');
$b = new \Exception('message');

echo strlen('Hello World!'); // 正常输出12
$c = new ArrayObject(); // 致命错误,找不到A\B\C\ArrayObject类

3、实例化

Static(静态)关键字

鉴于静态方法无需通过对象就可以调用,所以伪变量 $this
在静态方法中不可用。

静态属性不得以由对象通过 -> 操作符来访问。

用静态格局调用三个非静态方法会招致一个 E_ST传祺ICT 等第的大错特错。

.
完整的类名中,去掉最前头的命名空间分隔符,前边总是的三个或多个命名空间和子命名空间,作为「命名空间前缀」,其必得与最少二个「文件基目录」相呼应;
. 紧接命名空间前缀后的子命名空间 必得与相应的「文件基目录」相相称,在那之中的命名空间分隔符将作为目录分隔符。 .
末尾的类名 必得 与相应的以 .php 为后缀的文书同名。 的落到实处 一定不可
抛出特别、一定不足 触发任顶尖其余错误消息以至 不应有 有再次来到值。

help

  • 接济文书档案
  • 流程图帮助文书档案
use example;use example\test\demo;$class = new a();//实例化example命名空间下的a类$class = new b(); //实例化example\test\demo命名空间下的b类

frame 框架

  1. laravel入门
  2. dingo入门
  3. JWT入门
  4. Laravel框架关键技巧剖判
  5. laravel则修笔记
  6. rpc入门
  7. rabbitmq入门
  8. opencc多国语言
  9. laravel兄弟连笔记
  10. laravel进阶
use example;use example\test\demo;

类的电动加载

spl_autoload_register(卡塔尔国函数能够登记任性数量的全自动加载器,当使用未有被定义的类(class)和接口(interface)时自动去加载。

本例尝试分别从 MyClass1.php 和 MyClass2.php 文件中加载 MyClass1 和
MyClass2 类。

<?php
spl_autoload_register(function ($class_name) {
    require_once $class_name . '.php';
});

$obj  = new MyClass1();
$obj2 = new MyClass2();
?>

1、定义

最终静态绑定的用法

<?php

class A
{
    public static function who()
    {
        echo __CLASS__;
    }
    public static function test()
    {
//        self::who(); // 输出A
        static::who(); // 输出B
    }
}

class B extends A
{
    public static function who()
    {
        echo __CLASS__;
    }
}

$temp = new B();
$temp::test();

就此依附官方所说,在PHP中,命名空间用来消除在编排类库或应用程序时创制可采取的代码如类或函数时相遇的两类难题:

$this

在一个指标的诀窍中,$this长久是调用它的对象的援引。

希望本文所述对我们PHP程序设计有所扶助。

生成null值

yield能够在未曾子舆数字传送入的情事下被调用来生成贰个NULL值并配成对一个电动的键名。

能够选取生成器来开头化二个null数组。

<?php

function test()
{
    foreach (range(1, 3) as $i)
    {
        yield;
    }
}
var_dump(iterator_to_array(test()));

前言

末代静态绑定

自 PHP 5.3.0 起,PHP
增添了七个称呼和浩特中学期静态绑定的成效,用于在继续范围内引用静态调用的类。

注:一经use的时候是use example\test;则在实例化b类时要带上相对命名空间路线,即new demo\b();

目的复制

在大多数景色下,大家并无需完全复制一个对象来博取此中属性。但有三个情形下真的须求:假设您有贰个GTK 窗口对象,该对象具有窗口相关的能源。

您也许会想复制一个新的窗口,保持全体属性与原本的窗口相符,但不得不是多少个新的指标(因为假若不是新的靶子,那么一个窗口中的改动就能耳熟能详到另一个窗口)。

再有一种情景:

假诺目的 A 中保留着对象 B 的援用,当你复制对象 A
时,你想此中使用的对象不再是指标 B 而是 B 的二个别本,那么你必得获得指标A 的二个别本。

如此,在引入第三方类库的时候,独有种种类库的命名空间分歧样,就不会发出冲突。

指标和引用

在php5
的目标编制程序平时涉及的三个关键点是“默许情状下对象是经过援用传递的”。

但实际上那不是完全准确的。下面通过一些事例来证实。

PHP 的引用是外号,就是四个不等的变量名字指向肖似的从头到尾的经过。 在 PHP
5,四个指标变量已经不复保留整个对象的值。只是保存贰个标记符来访谈真正的目的内容。
当对象作为参数字传送递,作为结果重临,恐怕赋值给其余四个变量,此外贰个变量跟原先的不是援用的关系,
只是她们都封存着同三个标志符的正片,这么些标记符指向同二个对象的实在内容。

<?php

class A
{
    public $foo = 1;

}

$a = new A();
$b = $a;

$b->foo = 2;
echo $a->foo . "\n"; // 输出为2

压迫规定,但前段时间点不清开源项目都早就名重一时地利用了,这种专门的职业便于搜索命名空间下的类所在的路子。

对象相比较

当使用相比运算符(==)相比多个目的变量时,比较的标准是:

纵然四个目的的性质和个性值
都分外,并且四个对象是同三个类的实例,那么那八个目的变量相等。

而只要采纳全等运算符(===),这些对象变量一定要本着有些类的同一个实例(即同贰个目的)。

三、基于PS逍客4的命名空间标准

生成器语法

本人的接头正是链表来的,一个指南针像游标雷同,循环迭代。

一个生成器函数看起来像叁个平常性的函数,不一致的是日常函数再次来到一个值,而一个生成器能够yield生成相当多它所必要的值。

当贰个生成器被调用的时候,它回到一个足以被遍历的指标。当你遍历这么些目的的时候PHP将会在历次供给值的时候调用生成器函数,
并在产生多少个值之后保存生成器的情事,那样它就足以在急需发出下一个值的时候恢复生机调用状态。

本来全数的实例化都能够直接利用相对路径形式,即在命名空间前边加\字符,如new \example\test\demo\b();与此相类似就动用了相对路线情势实例化了b类。

使用命名空间:别称、导入

同意通过外号援引或导入外界的完全节制名称,是命名空间的一个重大特色。

<?php

namespace MyProject
{
    const CONNECT_OK = 1;
    class Connection
    {
        public function __construct()
        {
            echo "MyProject __construct" . "<br>";
        }
    }

    function connect()
    {
        echo "MyProject connect" . "<br>";
    }

    echo __NAMESPACE__ . "<br>";
}

namespace AnotherProject
{
    const CONNECT_OK = 1;
    class Connection
    {
        public function __construct()
        {
            echo "AnotherProject __construct" . "<br>";
        }
    }

    function connect()
    {
        echo "AnotherProject connect" . "<br>";
    }

    $temp = new \MyProject\Connection();
    use \MyProject as A;
    $temp = new A\Connection();
    use \Myproject\Connection as AConnection;
    $temp = new AConnection();

    echo __NAMESPACE__ . "<br>";
}