-
2019-01-13 20:01:54
//使用别名或引用,导入外部的完全限定名称的空间 //通过是为了导入外部的类,使用别名 //导入空间使用关键词:use namespace my; //导入空间别名,默认是全局开始 不用加\ use model\User; require 'public/User.php'; //echo \model\User::insert(); echo User::insert();
更多相关内容 -
PHP自动加载autoload和命名空间 namespace 及导入 use 的用法
2019-01-17 14:47:37命名空间: 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误。 需要注意的是: 命名空间的命名方式需要和文件夹文件名称对应; 使用namespace的...最近在研究别人项目的时候,看到了namespace 及use的使用,一头雾水,所以查了不少资料,做如下几个总结;
命名空间:
命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误。
需要注意的是: 命名空间的命名方式需要和文件夹文件名称对应;
使用namespace的目的:
团队合作项目时,避免与团队其它成员新建的类发生冲突;个人负责项目时,避免前后新建的类发生冲突;用到所需要的类时,需要先require或include引入,所以会发生类重定义的错误的前提是:两个相同命名的类都有被引入。目前有些php框架会自动加载(即include)所有新建的model类,所以为了避免你新建的model类和项目框架原生的核心类发生重名冲突,采用了namespace。(想了想,与团队成员新建的类产生冲突应该通过沟通避免,即使事发后也应该重新调整类名即时维护,避免后期造成因为对类的理解混淆而带来维护上的复杂度提高)
在引入一个命名空间的时候,使用到use这个关键词的时候。
自动加载:
1. 自动加载的原理以及__autoload的使用
自动加载的原理,就是在我们实例化一个 class 的时候,PHP如果找不到这个类,就会去自动调用本文件中的 __autoload($class_name) 方法,我们new的这个class_name 就成为这个方法的参数。所以我们就可以在这个方法中根据我们需要new class_name的各种判断和划分就去require对应的路径类文件,从而实现自动加载。
我们先来看下 __autoload() 的自动调用,举个栗子:
index.php
<?php $db = new Db();
如果我们不手动导入Db类,程序可能会报错,说找不到这个类:
Fatal error: Uncaught Error: Class 'DB' not found in D:\web\helloweba\demo\2017\autoload\index.php:2 Stack trace: #0 {main} thrown in D:\web\helloweba\demo\2017\autoload\index.php on line 2
那么,我们现在加入 __autoload() 这个方法再看看:
$db = new DB(); function __autoload($className) { echo $className; exit(); }
2. spl_autoload_register自动加载根据上面自动加载机制的描述,会输出:Db, 也就是我们需要new 的类的类名。所以,这个时候我们就可以在 __autoload() 方法里,根据需要去加载类库文件了。如果是小项目,用 __autoload() 就能实现基本的自动加载了。但是如果一个项目很大,或者需要不同的自动加载来加载不同路径的文件,这个时候__autoload就杯具了,因为一个项目中只允许有一个 __autoload() 函数,因为 PHP 不允许函数重名了,也就是说你不能声明2个 __autoload() 函数文件,否则会报致命错误。那怎么办呢?放心,你想到的,PHP大神早已经想到。 所以 spl_autoload_register() 这样又一个牛逼函数诞生了,并且取而代之它。它执行效率更高,更灵活。
先看下它如何使用,在index.php中加入以下代码。
<?php spl_autoload_register(function($className){ if (is_file('./Lib/' . $className . '.php')) { require './Lib/' . $className . '.php'; } }); $db = new Db(); $db::test();
在Lib\Db.php文件中加入以下代码:
<?php class Db { public static function test() { echo 'Test'; } }
也就是说, spl_autoload_register 是可以多次重复使用的,这一点正是解决了 __autoload 的短板,那么如果一个页面有多个 spl_autoload_register ,执行顺序是按照注册的顺序,一个一个往下找,如果找到了就停止。运行index.php后,当调用 new Db() 时, spl_autoload_register 会自动去lib/目录下查找对应的Db.php文件,成功后并且能够执行 $db::test(); 。同样如果在Lib\目录下有多个php类文件,都可以在index.php中直接调用,而不需要使用 require 多个文件。3. spl_autoload_register自动加载和namespace命名空间
对于非常复杂的系统,其目录结构也会非常复杂,规范的命名空间解决了复杂路径下大量文件、函数、类重名的问题。而自动加载现在是PHP现代框架的基石,基本都是 spl_autoload_register 来实现自动加载。所以spl_autoload_register + namespace 就成为了一个主流。
根据PSR系列规范,namespace命名已经非常规范化,所以根据namespace就能找到详细的路径,从而找到类文件。
我们用最简单的例子来说明复杂系统如何自动加载类文件。
首先,我们准备系统目录结构:
----/Lib
// 类目录
--Db.php
--Say.php
----autoload.php
// 自动加载函数
----index.php
// 首页
以上是一个基本的系统目录,我们要实现的是,使用命名空间和自动加载,直接在首页index.php调用Lib目录下的多个类。
我们准备两个列文件:
Db.php <?php namespace Lib; class Db { public function __construct() { //echo 'Hello Db'; } public static function test() { echo 'Test'; } } Say.php <?php namespace Lib; class Say { public function __construct() { //echo 'Hello'; } public function hello() { echo 'say hello'; } }
上两个普通的类文件,添加了命名空间: namespace Lib; 表示该类文件属于Lib\目录名称下的,当然你可以随便取个不一样的名字来表示你的项目名称。
现在我们来看autoload.php:
<?php spl_autoload_register(function ($class) { $prefix = 'Lib\\'; $base_dir = __DIR__ . '/Lib/'; // does the class use the namespace prefix? $len = strlen($prefix); if (strncmp($prefix, $class, $len) !== 0) { // no, move to the next registered autoloader return; } $relative_class = substr($class, $len); // 兼容Linux文件找。Windows 下(/ 和 \)是通用的 $file = $base_dir . str_replace('\\', '/', $relative_class) . '.php'; if (file_exists($file)) { require $file; } });
好了,现在我们在首页index.php这样调用:以上代码使用函数 spl_autoload_register() 首先判断是否使用了命名空间,然后验证要调用的类文件是否存在,如果存在就 require 类文件。?php use Lib\Db; use Lib\Say; require './autoload.php'; $db = new Db(); $db::test(); $say = new Say; $say->hello();
接下来就直接调用Lib/目录下的各种类文件了,你可以在Lib/目录下放置多个类文件尝试下。我们只需使用一个require将autoload.php加载进来,使用 use 关键字将类文件路径变成绝对路径了,当然你也可以在调用类的时候把路径都写上,如: new Lib\Db(); ,但是涉及到多个类互相调用的时候就会很棘手,所以我们还是在文件开头就使用 use 把路径处理好。运行index.php看看是不是如您所愿。
结束语
该文简单介绍了自动加载以及命名空间的使用,实际开发中,我们很少去关注autoload自动加载的问题,因为大多数现代PHP框架都已经处理好了文件自动加载的问题。开发者只需关注业务代码,使用规范的命名空间就可以了。当然,如果你想自己开发个项目不依赖大型框架亦或者自己开发php框架,那你就得熟悉下autoload自动加载这个好东西了,毕竟它可以让我们“偷懒”,省事多了。
现代php里,我们经常使用 Composer 方式安装的组件,都可以通过autoload实现自动加载,所以还是一个“懒”字给我们带来了极好的开发效率。
-
PHP namespace 命名空间 的基础
2021-04-08 08:17:321. 命名空间概述什么是命名空间?从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。...1. 命名空间概述
什么是命名空间?从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。具体举个例子,文件 foo.txt 可以同时在目录/home/greg 和 /home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件。另外,在目录 /home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前得到 /home/greg/foo.txt。这个原理应用到程序设计领域就是命名空间的概念。
2. 定义命名空间
语法:<?php
namespace 命名空间名;
?>
特点:
1. namespace 需要PHP 5.3 +
2. namespace 前面不允许任何的输出流代码(除了namespace自己),
它的作用范围 到下一个namespace开始 或 脚本结束
3. namespace只对本脚本起作用
4. 文件如果没有定义命名空间,则默认在全局命名空间之中
3. 定义子命名空间
namespace aaa\bbb\ccc;
?>
4. 在同一个文件中定义多个命名空间
1. 不推荐 一般一个文件中 定义一个命名空间
2. 万不得已 建议使用 {} 进行定界
5. 使用命名空间:基础
1. 非限定名称
直接调用函数/类型/常量,没有命名空间成分
2. 限定名称
就是使用时,有命名空间成分,但不以反斜线开头的. 类似于相对路径
3. 完全限定名称
以反斜线开头的, 又有命名空间成分的. 类似于绝对路径
6. 命名空间 和 动态语言特征
如果把 函数名/类名/常量名 赋值给变量去动态使用的话
在命名空间里 `必须` 写完全限定名称
注意: 在命名空间字串里 必须使用单引号包裹,不解析转义字符
7. namespace关键字和__NAMESPACE__常量
* namespace 关键字
声明命名空间
用来简化调用
* __NAMESPACE__ 常量
获取本命名空间的名字
PS.
::class
自 PHP 5.5 起,关键词 class 也可用于类名的解析。使用 ClassName::class 你可以获取一个字符串,包含了类 ClassName 的完全限定名称。这对使用了 命名空间 的类尤其有用。
8. 使用命名空间:别名/导入
别名<?php
use 命名空间 [as 别名];
?>
导入
use 命名空间\类名;
只能导入类
9. 全局空间
相当于 没有定义命名空间时的效果
-
php命名空间理解
2021-03-04 08:21:35声明//不可以用于definenamespace cn\qssq666\mydemo;function hello(){echo "hello";}使用姿势函数访问姿势hello();//不限定名称访问方式\...//限定名称但是不完全访问方式如果这样访问方法名是在其他的命名空...声明
//不可以用于define
namespace cn\qssq666\mydemo;
function hello(){
echo "hello";
}
使用姿势
函数访问姿势
hello();//不限定名称访问方式
\cn\qssq666\mydemo\hello();//完全限定名称访问方式
cn\qssq666\mydemo\hello();//限定名称但是不完全访问方式
如果这样访问方法名是在其他的命名空间那么访问的实际上是其他命名空间\此命名空间\方法名() 因此会报错,当然你可以来一个偷天换日,声明一个这样的命名空间,但是 有意义吗?
变量 类的访问姿势和这个一样
如
namespace \cn\qssq666;
class MyDemo{
public $name=''hero";
static $shit=" oh shit! ";
}
$myclass=\cn\qssq666\MyDemo();
echo $myclass->$name;
echo \cn\qssq666\MyDemo::$shit;
use关键字的作用
这东西出来也是一个奇葩,因为输入那么长很累,就出了一个类似java的导包import作用的东西,说到底就是php的命名空间不和包名类似,所以使用其他的就要使用很长很长的东西,那么这个就类似于导入包,但是导入却只导入 上级的。所以和java不同,use之后还需要加上包的最后一个名称才能访问
用法如下:
use cn\qssq666;
echo\qssq666\MyDemo::$shit;
//或者
use cn\qssq666\app\util\ui;
echo \ui\UIUtils::measure();
一个完整文件。
namespace cn\qssq666\util;
header("content-type:text/html;charset=utf-8");
echo "hello";
class MyDemo{
static $value="static value";
public function helloxx(){
echo "hello";
}
}
namespace cn\qssq666\ui;
function printInfo(){
echo "hello";
}
use \cn\qssq666\util\MyDemo;
echo "我的内容是". MyDemo::$value;
?>
作为初学者的我敲代码遇到的坑
声明命名空间 最开始的地方不需要加上\
访问的时候可以加可以不加,但是如果访问的代表在别的命名空间咋会找不到命名空间.
这个是反向斜杠符号 如果非反向符号是用不了的
既然定义了命名空间,那么必定有一个命名空间在最顶部,无逻辑代码方法,否则报错Fatal error: Namespace declaration statement has to be the very first statement or after any declare call in the script in D:\phpStudy\WWW\test.php on line xxx 总之line 不是1就对了,
out of the question
define 常量不区分命名空间,只能定义一个.
导包关键词use 的时候 可以在最后面加类这样不需要以最后面的包名开始 进行访问。
use \cn\qssq666\util\MyDemo;echo "我的内容是". MyDemo::$value;
不怕麻烦的话,导入的时候不导入类那么就是这样
use \cn\qssq666\util;echo "我的内容是". util\MyDemo::$value;
use导入的时候开始的\似乎加不加没关系,不受其它空间影响
没有名称空间的里面的函数和当前空间同时存在,即便是 这个包含那个,代码所使用处所在空间优先级高, 没有名称空间的函数所在域叫公共空间,当优先级高于公共空间的时候强制访问公共空间的时候加上\即可。这没啥好说的。很容易理解
-
php的命名空间
2019-07-06 22:14:27答:命名空间是一种带有限制性描述的关键词,能说明代码是“混”哪片的。他是在5.3版本中才加入的,这个版本号可以说是个分界点,也就是因为命名空间的存在,很多的开源的代码在安装的时候都会限制php代码大于等于... -
php命名空间里面的use关键字的理解
2016-05-02 17:56:22关于命名空间,上一篇文章解释的已经很清楚了,但是在引入一个命名空间的时候,使用到use这个关键词的时候,概念上有点模糊 个人经过尝试,理解如下: namespace Blog\Article\demo; class Comment { ... -
PHP中命名空间的使用例子
2021-02-01 18:22:57程序语言中的命名空间指的是一种特殊的作用域,它包含处于该作用域下的标识符,同时它本身也是一种标识符。可以把命名空间与操作系统的目录对应起来。一个命名空间相当于一个目录,命名空间里的类,函数,常量,相当... -
c++11内联命名空间的用处
2019-06-05 10:34:21内联命名空间将子命名空间的名字导入到父命名空间,这样就可以在其它子命名空间使用父命名空间直接调用。一方面是简化使用过程,另一方面可以实现功能函数版本迭代。 内联命名空间使用inline关键词前缀。 2.... -
php命名空间namespace应用
2019-03-25 15:16:26命名空间的实现跟我们系统目录文件的组织结构形式类似 , 一个目录下只能存在一个db.php文件。namespace关键字就是来定义类的空间区分。...\venter 这个是指全局命名空间下的其他子命名空间。但是这... -
Python之yaml包和模块命名空间探索
2021-05-18 11:57:42现在越来越多的开源软件在配置文件中都...这个可以直接导入一个yaml文件,转换为json格式的Python对象,也可以把一个Python的元组或者字典,直接写入一个yaml文件中 比如写入的语法格式如下: data={'name': '李四', -
C++PrimerPlus 学习笔记 | 第九章 内存模型和命名空间|2.10 名称空间
2022-02-12 16:13:13名称空间 在C++中名称可以是变量函数结构美剧类和类的结构和成员,随着项目的增大,名称相互冲突的可能性也可能上升,当使用多个厂商的类库,可能导致名称冲突。C++标准提供了名称空间工具,以便更好的控制名称的... -
PHP 命名空间和自动加载原理与用法实例分析
2021-04-11 10:54:54PHP 命名空间php5.3 之后引入了命名空间的特性,从本质上讲,命名空间就是一个容器,你可以将类、函数和变量放在其中,在命名空间中,你可以无条件地访问这些项,在命名空间之外,必须导入或引用命名空间,才能访问... -
第9章:内存与命名空间
2021-03-09 14:44:51include<>编译器会在存储标准头文件的文件系统查找,include""编译器会首先查找当前工作目录或者源文件目录。...//如果其他文件要使用这个变量,要使用extern关键词 // extern int global; static int one. -
自然语言处理之hanlp,Python调用与构建,分词、关键词提取、命名主体识别
2018-08-21 15:30:53HanLP是一系列模型与算法组成的NLP工具包,由大快搜索主导并完全开源,目标是普及自然语言处理在生产环境中的应用。HanLP具备功能完善、性能高效、...还有就是导入其基于Java的原始配置文件。 关于pyhanlp HanL... -
PHP命名空间和别名/导入(摘要)
2015-11-16 17:26:50一、命名空间概述 支持命名空间,php版本需要>=5.3.0。从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就... -
python导入模块
2020-11-29 00:23:00这是一篇关于python导入模块的...(这里介绍三个方法)1.import 直接import,这样是最简单的倒入模块方法但弊端是在每次要用这个模块中的函数时必须要添加该模块的命名空间。请看下面这个例子:# a_1.pydef mi2km(... -
PHP命名空间(Namespace)的使用详解
2019-10-08 18:09:23对于命名空间,官方的文档已经说的很详细,在这里我做了一下实践和总结。命名空间一个最明确的目的就是解决重名问题。Php中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误。这种情况下只要避免命名... -
python模块与包的导入
2020-12-20 05:50:17包A与包B下有相同的模块也不会冲突,如A.a与B.a这是来自两个命名空间 包结构 glance/ #Top-level package ├──__init__.py #Initialize the glance package ├── api#Subpackage for api │ ├──__init__.py ... -
oracle创建表空间语句-释义
2021-05-04 05:44:44经过长时间学习创建Oracle表空间,于是和大家分享一下,看完本文你肯定有不少收获,希望本文能教会你更多东西。1、先查询空闲空间selecttablespace_name,file_id,block_id,bytes,blocks fromdba_free_space;2、增加... -
在Python中从模块导入特定函数的要点
2021-03-18 09:23:23那么标题有点自我解释....那么与导入整个事物有何不同:import urllib示例可能看起来很简单,但有时我有一个更大的树,其中包含多个嵌套模块和包,如果我想:import level1.level2.level3.level4我应该只导入l... -
PHP 命名空间和自动加载
2018-09-12 07:37:00php5.3 之后引入了命名空间的特性,从本质上讲,命名空间就是一个容器,你可以将类、函数和变量放在其中,在命名空间中,你可以无条件地访问这些项,在命名空间之外,必须导入或引用命名空间,才能访问它所包含的项... -
Python 3.x | 史上最详解的 导入(import)
2018-07-27 15:05:02命名空间 在from module_name import 、import module_name中的体现:from关键词是导入模块或包中的某个部分。 from module_A import X:会将该模块的函数/变量导入到当前模块的命名空间中,无须用module_A.X访问了... -
模块导入的几种方式
2021-03-13 09:21:39概念Python 模块是一个以 .py 结尾的 Python 文件,包含了 Python 对象定义和...模块导入模块可以导入其它模块,习惯上把所有import语句放在模块的开头(不要求)。模块导入的方式有几种:方式一:使用 import 语... -
php易错笔记-类与对象,命名空间
2018-01-25 09:30:11类与对象 基本概念 new:如果在 new 之后跟着...如果该类属于一个名字空间,则必须使用其完整名称。 Example #3 创建一个实例 <?php $instance = new stdClass(); // 也可以这样做: $className = 'stdClass'; ... -
Typescript系统学习之监视代码,类型,类,接口,泛型使用,命名空间,装饰器笔记
2020-10-04 23:37:16启动自动监视,编译代码 ts中的类型编写 ts中的类,接口等相关内容 es5中类,继承相关内容 ts的类,接口相关内容 ts泛型(泛型定义,泛型函数,泛型类,泛型接口) 通过ts泛型模拟不同数据库使用 ts结构之命名空间,... -
空间计量:空间权重矩阵的构建
2020-12-19 11:46:13空间计量方法已经成为了时下最为热门和常用的计量方法之一,而空间权重矩阵的构建则是运用空间计量方法时必不可少的“标准动作”。但在实际研究过程中,我们往往会遇到很多问题。例如,目前网络上能获取到的矩阵与我... -
modern php笔记---2.1、特性(命名空间、特性、性状)
2019-08-07 15:54:00modern php笔记---2.1、特性(命名空间、特性、性状) 一、总结 一句话总结: legend2是真的非常好用,资质起码提升5倍,也就是学习效率提升了起码5倍 ...厂商命名空间是最重要的命名空间,厂...