BeWithYou

胡搞的技术博客

  1. 首页
  2. PHP
  3. PHP设计模式学习笔记(一)

PHP设计模式学习笔记(一)


正在慕课网看大话PHP设计模式的系列视频,讲师是Swoole框架的作者。这部分是铺垫,还没讲到具体的设计模式。

PHP面向对象高级特性

命名空间

最早的PHP没有命名空间的概念,PHP5.3开始支持。命名空间要声明在整个文件之前,声明之后,后面的函数、类都属于这个命名空间。如:

<?php
namespace MyNamespace;
function test()
{
    echo "test";
}

require了含有命名空间的文件后,如何调用命名空间下的方法,类等?只需要MyNamespace\test();即可。其实只要合理规划函数和类名,还是不要依赖命名空间比较好。PHP的命名空间设计跟C++相比还是显得比较怪异。

autoload自动载入

//举个例子 简单的autoload方法 引用到未定义的类时会去找
//已经废弃了 因为无法避免多个autoload
function __autoload($class)
{
    require __DIR__."/".$class.".php";  
}
//现在采用这个方法 可以注册多个autoload
spl_autoload_register('autoload1');
spl_autoload_register('autoload2');
function autoload1($class)
{
    //TODO
}

PSR-0基础框架

PSR-0规范

  1. 命名空间必须与绝对路径一致
  2. 类名首字母必须大写
  3. 除入口文件外,其他的PHP文件只能有一个类

符合PSR-0规范的基础框架

  1. 全部使用命名空间
  2. 所有PHP文件必须自动载入,不能用inlucde/require
  3. 单一入口

项目结构

├── App  
│   └── Controller  
│       └── Home  
│           └── Index.php  
├── IMooc  
│   ├── Loader.php  
│   └── Object.php  
└── index.php  

类文件采用绝对路径做命名空间,如App/Controller/Home/Index.php的命名空间为namespace App\Controller\Home;
入口文件index.php开头需要引入autoload方法。

include BASEDIR."/IMooc/Loader.php";
spl_autoload_register("\\IMooc\\Loader::autoload");

autoload类和方法如下:

namespace IMooc;

class Loader
{
    static function autoload($class)
    {
        //$class是包含命名空间的类名,需要把反斜杠转换成目录标记
        $file = BASEDIR."/".str_replace("\\","/",$class).".php";
        require $file;
    }
}

SPL(PHP标准库)

  1. SplStack,SplQueue,SplHeap,SplFixedArray
  2. ArrayIterator,AppendIterator,Countable,ArrayObject
  3. SPL提供的函数

具体略,去参考官方的文档说明。PHP里面还有类似C++ STL的一套东西。没有用到过。

链式调用

跟jQuery的链式调用一样,可以像这样调用。$db->select("name")->where(array("sex"=>1))->order(array("id","desc")); 其实就是在每个链式方法的最后返回本对象的$this。

PHP魔术方法的使用

  1. __get/__set 获取设置对象的属性
  2. __call/__callStatic 调用对象的方法/静态方法
  3. __toString 将对象转换成字符串
  4. __invoke 将对象当成函数执行
回到顶部