【问题标题】:Override some function cakephp (Late Static Bindings )覆盖一些函数 cakephp(后期静态绑定)
【发布时间】:2017-07-20 17:38:49
【问题描述】:

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

其中一个变化是位于~\lib\Cake\Core\App.php 中的App::load,因为它使用了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;
}

【问题讨论】:

  • 1) 您可以覆盖所有受保护的方法。

标签: php function cakephp overriding late-static-binding


【解决方案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 的问题和答案。如果手册不够,请自行搜索。


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

【讨论】:

  • 我只是不知道我们可以在 PHP 中覆盖受保护的函数,并且 在 php 中没有严重缺乏 OOP 方面的知识。感谢您的链接和解释。
  • 我认为这很严重,因为这在可能所有具有可见性范围关键字的支持 OOP 的语言中几乎都是相同的。出于这个原因,我认为这是一个严重的缺陷。它有效地阻止您理解和编写您想要使用受保护甚至私有的某些情况。这并不意味着冒犯。
猜你喜欢
  • 2015-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 2011-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多