php命名空间

PHP函数之---spl_autoload_register()

送分小仙女□ 提交于 2020-01-17 13:55:23
spl_autoload_register 函数的功能就是把传入的函数(参数可以为回调函数或函数名称形式)注册到 SPL __autoload 函数队列中,并移除系统默认的 __autoload() 函数。 一旦调用 spl_autoload_register() 函数,当调用未定义类时,系统就会按顺序调用注册到 spl_autoload_register() 函数的所有函数,而不是自动调用 __autoload() 函数。 现在,我们来创建一个 Linux 类,它使用 os 作为它的命名空间(建议文件名与类名保持一致): <?php namespace os; // 命名空间 class Linux // 类名 { function __construct() { echo '<h1>' . __CLASS__ . '</h1>'; } } 接着,在同一个目录下新建一个 PHP 文件,使用 spl_autoload_register 以函数回调的方式实现自动加载: <?php spl_autoload_register(function ($class) { // class = os\Linux /* 限定类名路径映射 */ $class_map = array( // 限定类名 => 文件路径 'os\\Linux' => './Linux.php', ); /*

浅析PHP类的自动加载和命名空间

大城市里の小女人 提交于 2020-01-15 13:35:59
php是使用 require(require_once) 和 include(include_once) 关键字加载类文件。但是在实际的开发工程中我们基本上不会去使用这些关键字去加载类。 因为这样做会使得代码的维护相当的困难。实际的开发中我们会在文件的开始位置用use关键字使用类,然后直接new这个类就可以了. 至于类是怎么加载的,一般都是框架或者composer去实现的。 <?php use Illuminate\Container\Container; $container = new Container(); 自动加载 我们可以通过一段 伪代码 来模拟一下在类的实例化工程中类是如何工作的 function instance($class) { // 如果类已加载则返回其实例 if (class_exists($class, false)) { return new $class(); } // 查看 autoload 函数是否被用户定义 if (function_exists('__autoload')) { __autoload($class); // 最后一次加载类的机会 } // 再次检查类是否存在 if (class_exists($class, false)) { return new $class(); } else { // 系统:我实在没辙了 throw

【PHP高级特性】自动加载

怎甘沉沦 提交于 2019-12-24 10:45:25
前言: include 和 require 是PHP中引入文件的两个基本方法。在小规模开发中直接使用 include 和 require 没哟什么不妥,但在大型项目中会造成大量的 include 和 require 堆积。这样的代码既不优雅,执行效率也很低,而且维护起来也相当困难。 为了解决这个问题,部分框架会给出一个引入文件的配置清单,在对象初始化的时候把需要的文件引入。 但这只是让代码变得更简洁了一些,引入的效果仍然是差强人意。PHP5 之后,随着 PHP 面向对象支持的完善,__autoload 函数才真正使得自动加载成为可能。 * include 和 require 功能是一样的,它们的不同在于 include 出错时只会产生警告,而 require 会抛出错误终止脚本。 * include_once 和 include 唯一的区别在于 include_once 会检查文件是否已经引入,如果是则不会重复引入。 1、自动加载 __autoload(废弃) 实现自动加载最简单的方式就是使用 __autoload 魔术方法。 当需要使用的类没有被引入时,这个函数会在PHP报错前被触发,未定义的类名会被当作参数传入 。至于函数具体的逻辑,这需要用户自己去实现。 首先创建一个 autoload.php 来做一个简单的测试: // 类未定义时,系统自动调用function _

PHP的命名空间

拜拜、爱过 提交于 2019-12-21 20:14:10
PHP的命名空间(namespace)是php5.3之后才有的。这个概念在C#中已经很早就有了,php中的namespace其实和c#的概念是一样的。 为什么php中要使用namespace? 假设如果不使用namespace,那么每个类在一个项目中的名字就必须是固定的。因为php在new的时候不管是调用autoload还是调用已加载过的类,都存在一个类名对应的文件。所以在没有namespace的时候,我们会想各种命名规则来区分不同的类,比如project1_school1_class1_Student或者project2_school_class_Student。 引入namespace之后就可以将这个有效规避了,一个namespace就相当于对应一个文件路径,查找这个类的时候,就会去对应的文件路径查找类定义文件了。 namespace的定义和使用 定义: <?php namespace Myproject; 或者 <?php namespace Myproject { } 使用: <?php use Myproject/School; <?php use Myproject/School as School1; // 别名 命名空间是运行时解析的。use就相当于一种声明,并不解析和加载。比如下面这个例子: test.php <?php use my\name; require

PSR规范 (psr-0,psr-1,psr-2,psr-3,psr-4)

自古美人都是妖i 提交于 2019-12-18 13:29:21
04是自动加载的规范, 12是代码规范, 3是日志规范,后面的数字就是升级版 PSR 是 PHP Standard Recommendations 的简写,由 PHP FIG 组织制定的 PHP 规范,是 PHP 开发的实践标准。 项目的目的在于:通过框架作者或者框架的代表之间讨论,以最低程度的限制,制定一个协作标准,各个框架遵循统一的编码规范,避免各家自行发展的风格阻碍了 PHP 的发展,解决这个程序设计师由来已久的困扰。 目前已表决通过了 6 套标准,已经得到大部分 PHP 框架的支持和认可。 1.PSR-0 自动加载规范,此规范已被启用-本规范已于2014年10月21日被标记为弃用,目前新的替代规范为【PSR-4】 本文是为自动加载器实现通用自动加载所需要遵循的编码规范 一个标准的命名空间与类名称的定义必须符合以下结构:\<Vendor Name><Namespace>*(ClassName) 其中Vendor Name 为每个命名空间都必须要有的一个顶级命名空间名 需要的话,每个命名空间下可以拥有多个子命名空间 当根据完整的命名空间名从文件系统中载入类文件时,每个命名空间之间的分隔符都会被转换成文件夹路径分隔符 类命名中的每个_字符也会被转换成文件夹路径分隔符,而命名空间中的_字符则是无特殊含义的。 当从文件系统中载入标准的命名空间或类时,都将添加.php为目标文件后缀

一次框架性能的比较,引起了我对搭建web框架的兴趣

喜你入骨 提交于 2019-12-18 08:07:36
背景 一次无意的访问,点击到了一个专门做PHP性能测试的网站,看这里 PHP Benchmarks 。 在里面发现了框架性能测试的结果,发现Laravel的框架性能尽然是最低的。瞬间受到了一万点的暴击,谁让最近一直用Laravel开发项目的呢。 说到底还是Laravel好用呀,方便不说,各方面支持的也不错,业务方面做的也是内部系统,哪怕性能慢点,也可以用前后端分离、负载均衡等手段解决掉,大体上也是够用。 不过,作为一个开发人员,理想还是要有的,这时就在想能不能采取Laravel框架的优点,用到什么就装什么,去掉一些请求到响应之间用不到的组件,精简框架。 之前也熟读过Laravel的源码,知道它的底层用的是Symfony的组件,毕竟没必要重复的造轮子。那么我们的框架之旅也将基于Symfony组件。。。 目录 一、Composer运行机制 二、框架前期准备 三、HttpFoundation组件封装Request、Response 四、路由处理 五、控制器处理相应功能(C) 六、分离模板(V) 七、分离模型(M) 八、剥离核心代码 九、优化框架 十、依赖注入(Dependency Injection) 正文 一、Composer运行机制 Composer的使用最关键的得益于 PHP标准规范 的出现,特别是其中的psr4, 自动加载规范 ,规范了如何指定文件路径从而自动加载类定义

php 自动加载机制

天大地大妈咪最大 提交于 2019-12-18 06:46:46
一、基础了解。 1、php引入文件使用include与require,这两个的区别在于,include可以在代码执行过程中再引入,而require是需要在代码执行前就进行引入操作。 2、命名空间。引入命名空间的作用是为了规避掉因为重名而引发的混乱与错误。可以把命名空间理解为一个箱子,不同的箱子都可以有苹果,但是A箱子的苹果与B箱子的苹果是不一样的。 psr-4对命名空间做了限定,\<顶级命名空间>(\<子命名空间>)*\类名。 3、autoload。接下来就是自动加载。升可以使用魔法函数__autoload进行自动加载,但是有一个限制,就是只能自动加载一次,这样对于需要多次进行加载是不友好的。 4、spl_autoload_register。这个函数的作用就是把传入的函数注册到spl_autoload_register函数队列,并移除系统默认的__autoload函数。 二、自动加载。 1、顶级命名空间路径映射。 //顶级命名空间以app为例 $vendorMap = [ 'app' => __DIR__. DIRECTORY_SEPARATOR.'app']; 2、解析文件路径 public static function find_path($class){ $vendor = substr($class,0,strpos($class,'\\')); $vendorDIR =

Laravel Composer自动加载机制

我怕爱的太早我们不能终老 提交于 2019-12-14 15:56:04
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 大纲 PHP 自动加载功能 1.1 PHP 自动加载功能的由来 1.2 PHP 自动加载函数 __autoload() 1.3 __autoload() 函数存在的问题 1.4 SPL Autoload PSR 规范 comoposer 的自动加载过程 composer 源码分析 4.1 启动 4.2 Composer自动加载文件 1, PHP 自动加载功能 1.1 PHP 自动加载功能的由来 在 PHP 开发过程中,如果希望从外部引入一个 Class ,通常会使用 include 和 require 方法,去把定义这个 Class 的文件包含进来。这个在小规模开发的时候,没什么大问题。但在大型的开发项目中,使用这种方式会带来一些隐含的问题:如果一个 PHP 文件需要使用很多其它类,那么就需要很多的 require/include 语句,这样有可能会 造成遗漏 或者 包含进不必要的类文件 。如果大量的文件都需要使用其它的类,那么要保证每个文件都包含正确的类文件肯定是一个噩梦, 况且 require或 incloud 的性能代价很大。 PHP5 为这个问题提供了一个解决方案,这就是 类的自动加载(autoload)机制 。 autoload机制 可以使得 PHP 程序有可能在使用类时才自动包含类文件

PHP基础语法

有些话、适合烂在心里 提交于 2019-12-10 06:52:14
输出语句 echo print 共同点: 都可以输出字符串 echo 使用的时候可以不用加括号,也可以加上括号: echo 或 echo() 。 print 同样是一个语言结构,可以使用括号,也可以不使用括号: print 或 print() 。 不同点: print_r() 方法 可以输出复杂数据类型 echo - 可以输出一个或多个字符串 print - 只允许输出一个字符串,返回值总为 1 echo 输出的速度比 print 快, echo 没有返回值,print有返回值1。 <?php $txt1 = "学习 PHP" ; $txt2 = "RUNOOB.COM" ; $cars = array ( "Volvo" , "BMW" , "Toyota" ) ; echo $txt1 ; echo "<br>" ; echo "在 $txt2 学习 PHP " ; echo "<br>" ; echo "我车的品牌是 { $cars [ 0 ] } " ; ?> //学习 PHP //在 RUNOOB.COM 学习 PHP //我车的品牌是 Volvo 字符串可以包含 HTML 标签 数据类型 String(字符串) Integer(整型) Float(浮点型) Boolean(布尔型) Array(数组) Object(对象) NULL(空值) var_dump()

tp5博客项目实战1

删除回忆录丶 提交于 2019-12-04 19:13:05
tp5博客项目实战 开发准备:环境wamp,windows系统为例。看实战博客,默认会搭建开发环境并且tp5框架已经至少有一定的基础。 tp5的下载与安装 方法一:直接在官网下载拷贝到wamp你的项目目录。 方法二:下载安装 composer,打开cmd 打开到你项目的根目录 更换阿里云的镜像(下载速度快) composer config -g repo.packagist composer https://packagist.phpcomposer.com 下载 composer create-project topthink/think=5.0.* tp5 --prefer-dist 此时你所在项目的根目录下就出现了tp5的文件夹 在浏览器打开localhost/你的站点/tp5/public 出现 十年磨一剑...就说明安装成功。 命名空间 同一个php里面不能出现相同的两个函数这个时候就需要用到namespace例如这样两个相同名称的函数因为放到了两个不同的命名空间所以不会报错。这就像同一个文件夹里不能出现两个一样名称的文件,我们在这个文件夹里面建两个子文件夹把文件分别放进去就可以了。 命名空间只对函数,类,以及常量起作用且常量不是define定义的。 const定义的常量一般在类里面,命名空间可以使其在类外面 引入了namespace的php前面