0

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

其中一个变化是App::load位于其中,~\lib\Cake\Core\App.php并且在使用static::_map($file, $className, $plugin);时,我可以编写一个扩展App.php和重写_map函数的类。

我的问题:

  1. 可以覆盖受保护的函数或属性吗?如果不:

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

  3. 在我的应用程序中,我应该在哪里定义扩展 App 的类 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;
}
4

1 回答 1

1

您在 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 上也有很多与两者相关的问题和答案。如果手册不够,只需搜索它们。


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

于 2017-07-20T20:16:12.960 回答