PSR,是PHP开发的事实标准;
PSR-0 自动加载:
命名空间必须与绝对路径一致。
类名首字母必须大写。
除入口文件外,其他”.php”必须只有一个类。
开发符合PSR-0规范的基础框架
严格全部使用命名空间。
所有PHP文件必须自动载入,不能有include/require。
单一入口。
SPL(PHP标准库)
SqlStack,SqlQueue,SplHeap,SqlFixedArray等数据结构类。
ArrayIterator、AppendIterator、Countable、ArrayObject。
SPL提供的函数。
PHP链式操作
eg:$db ->where()->limit()->order();
PHP魔术方法
__get/__set
常用于类的构造方法,当对象的属性不存在时,将自动调用 __set 初始化属性, __get 返回对象初始化属性。
__call/__callStatic
常用于类的构造方法,当对象的方法不存在时,将自动回调 __call 初始化方法, __callStatic 针对静态方法。
__toString
将对象转换成字符串类型。
__invoke
把对象当成函数去使用,则自动回调 __invoke 方法,返回对象传入的参数。
PHP的3种基本设计模式(1,2,3)
1、工厂模式,工厂方法或者类生成对象,而不是在代码中直接new;将new的操作统一,方便以后统一修改,就是在类中封装new方法,然后返回对象。可以在类做了修改后不必一个一个去修改各php文件中的new对象。
在工厂中写
class Factory{
static function createDatabase(){
$db = new Database();
return $db;
}
}
在index文件中写
$db = IMooc\Factory::createDatabase();
2、单例模式,使某个类的对象仅允许创建一个;私有化构造方法,提供获取本类对象的方法,私有构造函数+静态创建本类函数+受保护的属性(保存自身)
单例模式(口诀:三私一公)
class Singleton{
//私有化构造方法,禁止外部实例化对象
private function __construct(){}
//私有化__clone,防止对象被克隆
private function __clone(){}
//私有化内部实例化的对象
private static $instance = null;
// 公有静态实例方法
public static function getInstance(){
if(self::$instance == null){
//内部实例化对象
self::$instance = new self();
}
return self::$instance;
}
}
类只是被实例化了一次,如果是数据库连接,那么在一个脚本运行的生命周期内将只会创建一个连接
实现方式:
声明一个类的私有或者保护的静态变量,构造方法声明为私有(不允许外部进行new操作),如果不存在则实例化它,然后返回,如果存在则直接返回。
单例模式:私有构造函数+静态创建本类函数+受保护的属性(保存自身)
1.构造函数设为私有或保护
private function __construct(){}
2.编写getInstance()函数
static function getInstance()
{
if(self::$db){
return self::$db;
}else{
self::$db = new self();
return self::$db;
}
}
调用方式:类名::getInstance();
工厂+单例模式
class Factory
{
static function creatDatabase()
{
//如果不是单例模式这么写
//return new Database();
//用单例模式用以下方式写
return Database::getInstans();
}
}
//以下三种使用情况
//普通使用直接使用new一个对象
//$db=new Database();
//使用单例模式
//$db=Database::getInstance();
3、注册(树)模式,全局共享和交换对象;工厂方法里面,将需要的对象注册到注册树上面,然后该工厂方法只需要调用一次(可以放到系统环境初始化这样的地方),以后需要调用该对象的时候直接从注册树上面取出来即可,不需要再调用工厂方法和单例模式。
Register.php,用来将一些对象注册到全局的注册树上,可以在任何地方访问。set():将对象隐射到全局树上,_unset():从树上移除。get():去注册到树上的对象。在框架初始化的时候,会做注册器的初始化操作,然后可以在任何地方去访问注册器的方法。用来将一些对象注册到一个全局的树上,供全局访问;不用在通过类创建,具有全局对象树类。
namespace IMooc;
class Register{
protected static $objects;
static function set($alias,$object){
self::$objects[$alias] = $object;
}
static function get($name){
return self::$objects[$name];
}
function _unset($alias){
unset(self::$objects[$alias]);
}
}
在工厂模式写下
class Factory{
static function createDatabase(){
$db =Database::getInstance();
Register::set('db1', $db);
return $db;
}
}
在index.php
$db = IMooc\Factory::createDatabase();
$db1 = \IMooc\Register::get('db1');
var_dump($db);
var_dump($db1);