在一个新的命名空间中可定义任何标识符,PHP从5.3版本开始引入了命名空间

PHP中的命名空间

PHP从5.3本子开端引进了命名空间,之后多数共处PHP类库以至框架都初叶扶植它。那么PHP的命名空间怎么用吧?

出于方法、类在不一致体系中命名空间定义区别,第三方类库的命名空间也定义不等同,所以相关php协会出面了一套蔚然成风的正经,即PS凯雷德4标准,

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();

命名空间的定义

命名空间是一个器皿,这些容器主假设为了鉴定分别其下的类和函数。一旦定义了命名空间,它下边包车型地铁代码就归属那几个命名空间了,所以命名空间的概念要在代码的最起头行。

对此同一个包的话,同多少个命名空间依然子命名空间的代码未有供给在三个 PHP
文件中定义,子命名空间下的代码是为了变成一定模块的行事,组合起来就是三个包完整的命名空间。

假使编写的代码未有概念命名空间,那表明它归属全局的命名空间(\
符号),所以可以一贯援引类或许函数(不用增加 \ 符号)。

命名空间

什么样是命名空间吧?

命名空间(韩文:Namespace)表示标志符(identifier)的可以预知范围。多个标志符可在多少个命名空间中定义,它在不一样命名空间中的含义是互不相干的。那样,在三个新的命名空间中可定义任何标记符,它们不会与别的已有些标记符产生冲突,因为原来就有的定义都地处此外命名空间中。

简单的说说来命名空间是为着缓和区别库在同多个条件下利用时现身的命名冲突。举个例子作者要好有三个函数名为A,不过系统现本来就有一个A函数了,那就能够并发冲突。

用来规范命名空间的概念法规。

钦点键名来生成值

<?php$input = <<<'EOF'1;PHP;Likes dollar signs2;Python;Likes whitespace3;Ruby;Likes blocksEOF;function input_parse($input){    foreach (explode("\n", $input) as $line)    {        $fields = explode(';', $line);        $id     = array_shift($fields); // array_shift将数组开头的单元移出数组        yield $id => $fields;    }}foreach (input_parse($input) as $key => $value){    echo '$key=>' . $key . "<br>";    echo '$value=>' . print_r($value) . "<br>";}

引用命名空间标记符的二种方法

(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(卡塔尔 在命名空间 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    
//file a.php
namespace A;

const test = 'Atest'; 

function test() { 
    return __FUNCTION__; 
}

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

地点例子中就是一个优质的命名空间定义方法,只有constfunction,class受命名空间的自律。

\*\ 1. 完完全全的类名 必须 要有多少个一等命名空间,被称为 “vendor
namespace”; 2. 一体化的类名 能够 有二个或八个子命名空间; 3. 完整的类名
必得 有二个最终的类名; 4.
完好的类名中随机一部分中的下滑线都以从没有过非凡含义的; 5. 完整的类名 能够由任意大小写字母组成; 6. 全体类名都 必需 是大大小小写敏感的。

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则是从容不迫,它的产出催生了
PSPRADO-4 的名落孙山,进而也催生了 Composer 的勃兴,所以是比较重大的特征。

行任务名空间

接受命名空间的方法如下:

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

$class = new example\a();//实例化example命名空间下的a类$class = new example\test\demo\b(); //实例化example\test\demo命名空间下的b类

类常量

<?phpclass MyClass{    const constant = 'constant value';    function showConstant() {        echo  self::constant . "\n";    }}echo MyClass::constant . "\n";$classname = "MyClass";echo $classname::constant . "\n"; // 自 5.3.0 起$class = new MyClass();$class->showConstant();echo $class::constant."\n"; // 自 PHP 5.3.0 起?>

导入,别名

借使要使用的命名空间层级相当短且数额超多,那么在采用的时候特意麻烦,所以能够运用
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奥迪Q5-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

use example;use example\test\demo;

yield关键字

生成器函数的中坚就是yield关键字。它最简易的调用方式看起来像贰个return申明,不一致之处在于不乏先例return会重回值并
终止函数的执行,而yield会重返多少个值给循环调用此生成器的代码并且只是暂停推行生成器函数。

<?phpfunction test(){    for ($i = 0; $i <= 10; $i++)    {        // 注意:变量$i的值在不同的yield之间是保持传递的。        yield $i;    }}$temp = test();foreach ($temp as $value){    echo "$value" . "<br>";}

一、PHP命名空间根基

抽象类

其余二个类,假使它此中足足有一个方法是被声称为架空的,那么这几个类就务须被声称为架空的。

<?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";?>

如上内容援引了PS帕杰罗4文书档案地址:

遍历对象

PHP 5 提供了一种概念对象的主意使其得以经过单元列表来遍历, 比如用
foreach 语句。暗中认可景况下,全体可以看到属性都将被用来遍历。

<?phpclass MyClass{    public $var1 = 'value 1';    public $var2 = 'value 2';    public $var3 = 'value 3';    protected $protected = 'protected var';    private $private = 'private var';    function iterateVisible()    {        echo "MyClass::iterateVisible:<br>";        foreach ($this as $key => $value)        {            print '$key=>' . $key . "<br>";            print '$value=>' . $value . "<br>";        }    }}$class = new MyClass();$class->iterateVisible();foreach ($class as $key => $value){    print '$key=>' . $key . "<br>";    print '$value=>' . $value . "<br>";}

4、别名

server 环境

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

1、代码复用类Trait也合乎命名空间的标准,即通过命名空间下Trait类不能够重名;2、固然PSLacrosse4规定了命名空间路线与公事路线要求相呼应,可是运维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代码都得以分包在命名空间中,但唯有以下类别的代码受命名空间的影响,它们是:

类、接口、函数和常量。

取名空间通过入眼字namespace来声称。假设五个文书中富含命名空间,它必需在别的代码以前扬言命名空间,
有一个除了:declare关键字。

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

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

db 数据库

  1. elasticsearch入门
  2. 数据库操作
  3. 数据库设计
  4. redis入门

3、实例化

取水援用

当unset叁个引用,只是断开了变量名和变量内容之间的绑定。那并不表示变量内容被销毁了。

$a = 1;$b = &$a;unset($a);

从广义上来说,命名空间是一种包装事物的模式。在广大地方都得以看来这种抽象概念。例如PHP的类名是不得以重新的,可是经常大家须要引进一些第三方的类库,平时类名就能够在档期的顺序中生出重复矛盾,所以,命名空间就是解除那么些冲突的一种办法。

类的机动加载

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

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

<?phpspl_autoload_register(function ($class_name) {    require_once $class_name . '.php';});$obj  = new MyClass1();$obj2 = new MyClass2();?>

1、顾客编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。2、为不长的标志符名称创立八个小名的称呼,进步源代码的可读性。

case 实例

  1. php面试题笔记
  2. pythonLogo提取
  3. 字幕乱码难题
  4. 支付宝接口调用
  5. laravel开荒笔记

则该命名空间下的类都归于于该命名空间,example命名空间下的类不可能重名。

对象系列化

种类化对象 – 在对话中寄存对象

装有php里面包车型大巴值都能够接纳函数serialize(卡塔尔国来回到三个满含字节流的字符串来代表。
unserialize(卡塔尔函数能够重新把字符串变回php原本的值。
种类化三个对象将会保留对象的持有变量,不过不会保留对象的措施,只会保存类的名字。

<?php////include("class.inc");////$a = new A();//$a->show_one();////$s = serialize;//file_put_contents('store', $s);// 反序列化必须要包含此文件。include("class.inc");$s = file_get_contents('store');$a = unserialize($s);$a->show_one();

发表评论

电子邮件地址不会被公开。 必填项已用*标注