ThinkPHP5 Extend 扩展写法

首先ThinkPHP是基于PHP来编写的一套框架,所以它的扩展自动加载的方法也必须依托于PHP,而PHP对自动加载进行了PSR-4规则限定。下面两个是中英文说明。

英文:https://www.php-fig.org/psr/psr-4/

中文:https://www.jianshu.com/p/e0a33214688b


了解了规则后编写就相对简单,ThinkPHP扩展的编写过程,实际就是一个类文件的编写过程。只不过不能避免的要加上命名空间等等内容,这些内容上述说明也有写。这里主要说一下父类或者超类的问题。


父类是可以继承的类,在其他语言中可以存在多继承,而PHP中只能单继承,即只继承一个父类。


类的构造方法:__construct 这个方法是你在New一个类的时候,由解释器进行类初始化的时候第一个执行的页面函数。这里可以进行一些初始化的行为。


注意的是:如果在子类中定义与父类中相同的函数或者方法。那么父类中相同的函数或方法会被覆盖,即不会执行。哪怕他是构造函数等一些魔术方法。所以如果你在子类中定义了__construct那么父类不会被执行。


例子:

/** 父类 */
class TopParent
{
    public function __construct()
    {
        echo "TopParent";
    }
}
/** 子类 */
class SubClass extends TopParent
{
     public function __construct(Request $request = null)
     {
         echo "SubClass";
     }
}
/** Tp引用 */
class Index extends SubClass
{
    public function index()
    {
        echo "";
    }
}

结果输出:

*~:SubClass


这里定义了一个SubClass类,并且是基于Controller的子类。基于ThinkPHP5的运行机制,会将要给Controller的初始化参数,即__construct参数所需要的值传递给SubClass子类。在你新建这个类的时候IDE会自动帮你加上一句话:parent::__construct($request);这句话就是手动运行父类的构造方法。因为父类的构造方法不会再自己执行。当然你也可以不执行父类的构造方法。但是如果不执行的话,如果你的派生类用到了父类的方法。而这个方法恰恰需要父类自己进行初始化。那么很有可能会报错。所以在执行一遍父类的构造方法很有必要。


对于为什么控制器可以有一个默认的$request参数。这里可以参考如下代码:

文件路径:thinkphp\library\think\Loader.php

/**
     * 实例化(分层)控制器 格式:[模块名/]控制器名
     * @access public
     * @param  string $name         资源地址
     * @param  string $layer        控制层名称
     * @param  bool   $appendSuffix 是否添加类名后缀
     * @param  string $empty        空控制器名称
     * @return object
     * @throws ClassNotFoundException
     */
    public static function controller($name, $layer = 'controller', $appendSuffix = false, $empty = '')
    {
        list($module, $class) = self::getModuleAndClass($name, $layer, $appendSuffix);
        if (class_exists($class)) {
            return App::invokeClass($class);
        }
        if ($empty) {
            $emptyClass = self::parseClass($module, $layer, $empty, $appendSuffix);
            if (class_exists($emptyClass)) {
                return new $emptyClass(Request::instance());
            }
        }
        throw new ClassNotFoundException('class not exists:' . $class, $class);
    }



ThinkPHP5 Extend 扩展写法


本站如无特别说明即为原创,转而告知:(http://iwonmo.com/archives/1337.html)

标签: tp5编写扩展, tp5 extend, tp5 传参

添加新评论