覆盖一些函数 cakephp(后期静态绑定)

Override some function cakephp (Late Static Bindings )

我用CakePHP 2.9.8开发了一个7年前写的老应用,一直开发到现在。 不幸的是,第一位开发人员在 CakePHP 的库中添加了一些代码,为了迁移到 CakePHP 的第 3 版,我需要在应用程序中传输更改。

其中一个变化是位于 ~\lib\Cake\Core\App.phpApp::load 中,因为它使用了 static::_map($file, $className, $plugin);,我可以写一个 class 来扩展 App.php并重写 _map 函数。

我的问题:

  1. 是否可以覆盖受保护的函数或属性? 如果没有:

  2. 为什么在 CakePHP 中它们像 static:: 一样被使用(或称呼)例如:static::_map($file, $className, $plugin); 但定义是 protected static function _map($file, $name, $plugin = null) 如果是:

  3. 我应该在我的应用程序中的什么地方定义扩展应用程序的 class Foo 和我想删除开发人员更改的 load 函数,我应该在哪里写 Foo::load?.

我在这里也放了App::load函数:

public static function load($className) {
    if (!isset(static::$_classMap[$className])) {
        return false;
    }
    if (strpos($className, '..') !== false) {
        return false;
    }

    $parts = explode('.', static::$_classMap[$className], 2);
    list($plugin, $package) = count($parts) > 1 ? $parts : array(null, current($parts));

    $file = static::_mapped($className, $plugin);
    if ($file) {
        return include $file;
    }
    $paths = static::path($package, $plugin);

    if (empty($plugin)) {
        $appLibs = empty(static::$_packages['Lib']) ? APPLIBS : current(static::$_packages['Lib']);
        $paths[] = $appLibs . $package . DS;
        $paths[] = APP . $package . DS;
        $paths[] = CAKE . $package . DS;
    } else {
        $pluginPath = CakePlugin::path($plugin);
        $paths[] = $pluginPath . 'Lib' . DS . $package . DS;
        $paths[] = $pluginPath . $package . DS;
    }

    $normalizedClassName = str_replace('\', DS, $className);

    // Start point of custom codes
    // Load Custom Classes that are usually added during customizations
    // This part is for accepting a class like **XControllerCustom** but the name of file is: **XController**
    if($package === 'Model'){
        foreach ($paths as $path) {
            $file = $path . DS . $className . '.php';
            $file_custom = $path . 'Custom' . DS . $normalizedClassName . '.php';
            if (file_exists($file_custom) && file_exists($file)) {
                self::_map($file_custom, $className);
                include $file;
                return include $file_custom;
            }
        }
    }
    // End of custom's code     

    foreach ($paths as $path) {
        $file = $path . $normalizedClassName . '.php';
        if (file_exists($file)) {
            static::_map($file, $className, $plugin);
            return include $file;
        }
    }

    return false;
}

您在 php 中严重缺乏 OOP 知识。仔细阅读这些链接,它们会给您答案,并希望您能完全理解这两个主题。

  1. http://php.net/manual/en/language.oop5.visibility.php
  2. http://php.net/manual/en/language.oop5.late-static-bindings.php

在 SO 上也有 很多 的问题和答案。如果手册不够用,就搜索它们。


三号没有固定位置。只需将它放在应用程序内的 LibUtility 文件夹中。但是,我会选择一个自动加载器而不是内置的 App 东西,只使用 uses 使我的 类 可用。如果您的应用程序还没有使用 composer,只需添加它并使用它的 autoader 和命名空间。 2.x 仍未使用它们的唯一原因是向后兼容性。 App 是一个拐杖,可以在不实际使用它们的情况下完成类似命名空间的功能。