自动类加载 (auto-load)
自动类加载说白了就是自动 include / require php 文件,这里以: Aliyun_Log_Client 为例说明。
如果想使用 Aliyun_Log_Client 这个类, 需要先 :
1 | require_once('aliyun/Aliyun/Log/Client.php'); |
这里你不仅需要手动 require, 还需要知道 php 文件的相对位置。
但是如果实现了自动类加载呢, 你只需要
1 | use Aliyun_Log_Client; |
我们知道 PHP 执行的本质还是需要将依赖的 php 文件都加载在一起,那么自动类加载是如何做到的呢?
主要需要做两件事:
spl_autoload_register注册一个解析class名的函数- 根据
class名找到对应的php文件并调用require
这里看 Aliyun_Log 是如何实现的:
Log_Autoload.php
1 |
|
然后你需要在代码执行之前 require 这个文件。
懂得了这个,你就可以组织自己的代码结构,定义自己的命名习惯,并且可以很方便的给别人使用.
魔术方法 (magic method)
如: __get(), __set(). __isset, __unset, __call, __callstatic 这些方法,在实现框架代码时是很常见且常用的,知道什么时候这些魔术方法会被调用,以及它能用来做什么事情,对于一个 PHPer 来说很标配。以 __get(), __set() 来例:
1 |
|
这样,Object 具有的属性就可以动态扩展了, 如:
1 | $ob = new Object(); |
那它有什么用武之地呢?
它可以作为一个基类,来封装对数据库的操作,实现自己的 ORM 框架, 如:
DB.php
1 |
|
Model.php
1 |
|
Test
1 |
|
当然这里说的只是一个例子, 真正的框架要做的事很多,但是原理性的东西就是那些。
static 与 self
self正如其名字,指向的是当前类static指向的则是实际调用类
看下面的示例:
1 |
|
最后的输出结果为:
1 | hint B // 使用 static 调用时会调用父类同名方法 |
清楚了 self, static的作用方法,在看一些框架代码,或者自己写具有层级关系的代码时,考虑一些方法的作用域时,就可以通过static , self 来决定子类是否可以覆盖父类同名方法了。
php-cli 与 php-fpm
PHP CLI是命令行接口, 是位于创建独立的程序 (如:在命令行运行一个php文件,执行一些耗时的操作)PHP CGI是PHP CGI(通用网关接口) 的一种实现,主要是用于 web 应用。
举一些常见的区别:
pcntl_fork命令只能做cli模式,不能再fpm模式$_SERVER,$_POST这些 这些全局变量就只能在fpm模式下有效, 在cli下不存在
composer
composer 是 PHP的一个包依赖管理, 定义了一下自动加载规范,可以下载,管理依赖.
匿名函数, 闭包
trait
用于定义一些方法集,可以被其它类使用,感觉主要是为了解决不能多继承的问题
命名空间 (namespace)
与文件系统中的目录结构类似,可以用来区分同名文件