PHP中的命名空间

1. PHP中的命名空间是什么?

官方解释在此: 命名空间概述

命名空间用一句话说,就是:把 类、函数、变量 等放到逻辑子文件夹中去,以避免命名冲突。

注:命名空间跟实际代码文件在文件系统中的路径没有任何关系,如果你感到迷茫,可以看看本文最后一节。

2. 被隐藏的第一个 \

在每个 PHP 文件的最开始定义命名空间:

<?php namespace TinyLara\TinyRoute;class TinyRoute {...
}

在定义命名空间之后引入命名空间:

<?php namespace TinyLara\TinyRoute;use TinyLara\TinyView\TinyView;class TinyRoute {...
}

上述代码中,

namespace TinyLara\TinyRoute
use TinyLara\TinyView\TinyView

这两行的真实路径是: \TinyLara\TinyRoute、\TinyLara\TinyView\TinyView,顶级命名空间标识(第一个 \ )被省略了。

3. 被隐藏的别名

在上一节中中,这一行代码

use TinyLara\TinyView\TinyView

的完整写法应该是:

use \TinyLara\TinyView\TinyView as TinyView;

如果不指定别名,那就默认别名为类名。

4. 使用绝对路径直接调用

 

<?php namespace TinyLara\TinyRoute;class TinyRoute {public function foo(){return \TinyLara\TinyView\TinyView::fuck();}
}

使用绝对路径调用类时顶级命名空间标识(第一个 \ )不能省略。(很多人都在这个地方迷惑了)

5. 命名空间的实际价值

命名空间的存在是为了解决下面两个问题:

  1. 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
  2. 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。

目前非常流行的 Composer 就是一个基于命名空间的包管理器/依赖管理器,同样,Laravel 能达到今天的成功,很大程度上也是因为PHP5.3的普及,生恰逢时。你可以在 https://packagist.org/ 上下载到各种 composer 包,类似于 yum、npm或者gem。

6. 同一命名空间下的类可以任意相互调用

<?php namespace A;class ClassA {public static function test() {echo 'Success!';}
}
<?php namespace A;class ClassB {public static function test() {ClassA::test(); // 直接调用即可}
}

直接调用即可。

7. 关于代码文件的结构

PSR-4 命名空间规范约定了 PHP 类的命名空间应该和实际在文件系统中的位置一致,而现实中绝大多数 PHP 框架为了方便都采纳了这条规范,最明显的就是 Laravel 4 到 5 的转变。在这种情况下,我发现不少新手又迷茫了,错误地理解了我在上文中的阐述的“路径”的概念。基于此我要简单讲述一下 PHP 运行的基本流程,我相信看完你们就不会再有上面的误解了。

PHP 运行流程

在一个典型的 Apache +  mod_php 架构的 PHP 运行环境中,一个 PHP 网站是这样运行的:

  1. Apache 收到用户的 HTTP 请求
  2. 这个请求是以 .php 结尾或者是一个不存在的路径(.htaccess 会将其转发到 index.php)
  3. Apache 的 mod_php 会启动一个新的 PHP 进程(PHP 解释器),读取 HTTP 请求的 URL 中的那个 .php 文件或者 index.php
  4. 被读取进 PHP 解释器的字符串被按照 PHP 的语法进行解析。为了方便理解,我们将这些经过解析的字符串所生成的 context(上下文)命名为 Matrix
  5. 然后 PHP 解释器会根据从 Matrix 中解析出的特定 PHP 语句(如 require)载入其他 PHP 文件,并将其内容以字符串的形式加入 Matrix
  6. 最终 Matrix 变成一个数万行代码的巨型上下文(为了便于理解可以想象成巨长的代码文件字符串),PHP 解释器会按照 PHP 语法执行 Matrix,进行数据库连接、网络请求、文件读写等操作
  7. 每一次的 echo 都会被写入到输出缓冲区,最终这个巨长的代码字符串被执行完毕,PHP 进程退出内存
  8. 缓冲区中就是要发给用户的 HTTP response,其实就是一堆字符串,只不过它遵守 HTML 规范,可以被浏览器解析。这一堆字符串被 Apache 发送回用户的浏览器,浏览器渲染,用户看到内容

命名空间在哪里?

命名空间从始至终就是一个“内部伪概念”,只是用于解决类和变量的命名冲突,从来就跟实际文件结构没有半毛钱的关系。让大家疑惑的其实是自动加载,当它和命名空间混杂在一起的时候,就不容易理解了。命名空间从来就是一个纯 PHP 内部的概念,你可以把整个 Laravel 框架的所有文件合并成一个巨大的 PHP 文件,取消自动加载,除了性能会损失一些,功能不会受到任何影响,命名空间依旧运转良好。

转载于:https://www.cnblogs.com/tpshop/p/8297348.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/391445.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pandas 入门

pandas简介&#xff1a;pandas包含的数据结构和数据处理工具的设计使得利用进行数据清洗和数据分析非常快捷&#xff1b;与numpy的区别&#xff0c;pandas用来处理表格型或异质型数据的&#xff0c;而numpy更适合处理同质型的数值类数据。 1、Series简介 1、Series是一种一维的…

传智播客软件测试第一期_播客:冒险如何推动一位软件工程师的职业发展

传智播客软件测试第一期On this weeks episode of the freeCodeCamp podcast, Abbey chats with developer and wearer of many hats Princiya about how she changed careers, moved to Berlin, and worked her way up to a lead role.在本周的freeCodeCamp播客节目中&#xf…

爬虫神经网络_股市筛选和分析:在投资中使用网络爬虫,神经网络和回归分析...

爬虫神经网络与AI交易 (Trading with AI) Stock markets tend to react very quickly to a variety of factors such as news, earnings reports, etc. While it may be prudent to develop trading strategies based on fundamental data, the rapid changes in the stock mar…

Promise 原理解析与实现(遵循Promise/A+规范)

1.什么是Promise? Promise是JS异步编程中的重要概念&#xff0c;异步抽象处理对象&#xff0c;是目前比较流行Javascript异步编程解决方案之一 2.对于几种常见异步编程方案 回调函数事件监听发布/订阅Promise对象这里就拿回调函数说说 1.对于回调函数 我们用Jquery的ajax获取数…

php 数据访问练习:投票页面

<!--投票界面--> <html> <head> <title></title> <meta charset"UTF-8"/> <link rel"stylesheet" type"text/css" href"bootstrap.min.css"/> <script src"bootstrap.min.js"…

深入理解InnoDB(3)—索引的存储结构

1. 索引的各种存储结构及其优缺点 1.1 二叉树 优点&#xff1a; 二叉树是一种比顺序结构更加高效地查找目标元素的结构&#xff0c;它可以从第一个父节点开始跟目标元素值比较&#xff0c;如果相等则返回当前节点&#xff0c;如果目标元素值小于当前节点&#xff0c;则移动到左…

有抱负/初级开发人员的良好习惯-避免使用的习惯

When youre learning to code, it can be easy to pick up some nasty habits along the way. Here are some tips to avoid common bad habits, and the good habits to keep in mind.当您学习编码时&#xff0c;很容易在此过程中养成一些讨厌的习惯。 这里有一些技巧&#xf…

业精于勤荒于嬉---Go的GORM查询

查询 //通过主键查询第一条记录 db.First(&user)SELECT * FROM users ORDER BY id LIMIT 1;// 随机取一条记录 db.Take(&user)SELECT * FROM users LIMIT 1;// 通过主键查询最后一条记录 db.Last(&user)SELECT * FROM users ORDER BY id DESC LIMIT 1;// 拿到所有的…

apache 虚拟主机详细配置:http.conf配置详解

Apache的配置文件http.conf参数含义详解 Apache的配置由httpd.conf文件配置&#xff0c;因此下面的配置指令都是在httpd.conf文件中修改。主站点的配置(基本配置) (1) 基本配置:ServerRoot "/mnt/software/apache2" #你的apache软件安装的位置。其它指定的目录如果没…

深入理解InnoDB(4)—索引使用

1. 索引的代价 在了解索引的代价之前&#xff0c;需要再次回顾一下索引的数据结构B树 如上图&#xff0c;是一颗b树&#xff0c;关于b树的定义可以参见B树&#xff0c;这里只说一些重点&#xff0c;浅蓝色的块我们称之为一个磁盘块&#xff0c;可以看到每个磁盘块包含几个数据…

[BZOJ1626][Usaco2007 Dec]Building Roads 修建道路

1626: [Usaco2007 Dec]Building Roads 修建道路 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 1730 Solved: 727 [Submit][Status][Discuss]Description Farmer John最近得到了一些新的农场&#xff0c;他想新修一些道路使得他的所有农场可以经过原有的或是新修的道路互达…

双城记s001_双城记! (使用数据讲故事)

双城记s001Keywords: Data science, Machine learning, Python, Web scraping, Foursquare关键字&#xff1a;数据科学&#xff0c;机器学习&#xff0c;Python&#xff0c;Web抓取&#xff0c;Foursquare https://br.pinterest.com/pin/92816442292506979/https://br.pintere…

python:linux中升级python版本

https://www.cnblogs.com/gne-hwz/p/8586430.html 转载于:https://www.cnblogs.com/gcgc/p/11446403.html

web前端面试总结

2019独角兽企业重金招聘Python工程师标准>>> 摘要&#xff1a;前端的东西特别多&#xff0c;面试的时候我们如何从容应对&#xff0c;作为一个老兵&#xff0c;我在这里分享几点我的经验。 一、javascript 基础(es5) 1、原型&#xff1a;这里可以谈很多&#xff0c;…

783. 二叉搜索树节点最小距离(dfs)

给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。 注意&#xff1a;本题与 530&#xff1a;https://leetcode-cn.com/problems/minimum-absolute-difference-in-bst/ 相同 示例 1&#xff1a; 输入&#xff1a;root [4,2,6,1,3] 输…

linux epoll机制对TCP 客户端和服务端的监听C代码通用框架实现

1 TCP简介 tcp是一种基于流的应用层协议&#xff0c;其“可靠的数据传输”实现的原理就是&#xff0c;“拥塞控制”的滑动窗口机制&#xff0c;该机制包含的算法主要有“慢启动”&#xff0c;“拥塞避免”&#xff0c;“快速重传”。 2 TCP socket建立和epoll监听实现 数据结构…

linux中安装robot环境

https://www.cnblogs.com/lgqboke/p/8252488.html&#xff08;文中验证robotframework命令应该为 robot --version&#xff09; 可能遇到的问题&#xff1a; 1、python版本太低 解决&#xff1a;升级python https://www.cnblogs.com/huaxingtianxia/p/7986734.html 2、pip安装报…

angular 模块构建_我如何在Angular 4和Magento上构建人力资源门户

angular 模块构建Sometimes trying a new technology mashup works wonders. Both Magento 2 Angular 4 are very commonly talked about, and many consider them to be the future of the development industry. 有时尝试新技术的mashup会产生奇迹。 Magento 2 Angular 4都…

tableau破解方法_使用Tableau浏览Netflix内容的简单方法

tableau破解方法Are you struggling to perform EDA with R and Python?? Here is an easy way to do exploratory data analysis using Tableau.您是否正在努力使用R和Python执行EDA&#xff1f; 这是使用Tableau进行探索性数据分析的简单方法。 Lets Dive in to know the …

六周第三次课

2019独角兽企业重金招聘Python工程师标准>>> 六周第三次课 9.6/9.7 awk awk也是流式编辑器&#xff0c;针对文档中的行来操作&#xff0c;一行一行地执行。 awk比sed更强大的功能是它支持了分段。 -F选项的作用是指定分隔符&#xff0c;如果不加-F选项&#xff0c;…