覆盖一些函数 cakephp(后期静态绑定)
Override some function cakephp (Late Static Bindings )
我用CakePHP 2.9.8开发了一个7年前写的老应用,一直开发到现在。
不幸的是,第一位开发人员在 CakePHP 的库中添加了一些代码,为了迁移到 CakePHP 的第 3 版,我需要在应用程序中传输更改。
其中一个变化是位于 ~\lib\Cake\Core\App.php
的 App::load
中,因为它使用了 static::_map($file, $className, $plugin);
,我可以写一个 class 来扩展 App.php
并重写 _map
函数。
我的问题:
是否可以覆盖受保护的函数或属性?
如果没有:
为什么在 CakePHP 中它们像 static::
一样被使用(或称呼)例如:static::_map($file, $className, $plugin);
但定义是 protected static function _map($file, $name, $plugin = null)
如果是:
我应该在我的应用程序中的什么地方定义扩展应用程序的 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 知识。仔细阅读这些链接,它们会给您答案,并希望您能完全理解这两个主题。
- http://php.net/manual/en/language.oop5.visibility.php
- http://php.net/manual/en/language.oop5.late-static-bindings.php
在 SO 上也有 很多 的问题和答案。如果手册不够用,就搜索它们。
三号没有固定位置。只需将它放在应用程序内的 Lib
或 Utility
文件夹中。但是,我会选择一个自动加载器而不是内置的 App
东西,只使用 uses
使我的 类 可用。如果您的应用程序还没有使用 composer,只需添加它并使用它的 autoader 和命名空间。 2.x 仍未使用它们的唯一原因是向后兼容性。 App
是一个拐杖,可以在不实际使用它们的情况下完成类似命名空间的功能。
我用CakePHP 2.9.8开发了一个7年前写的老应用,一直开发到现在。 不幸的是,第一位开发人员在 CakePHP 的库中添加了一些代码,为了迁移到 CakePHP 的第 3 版,我需要在应用程序中传输更改。
其中一个变化是位于 ~\lib\Cake\Core\App.php
的 App::load
中,因为它使用了 static::_map($file, $className, $plugin);
,我可以写一个 class 来扩展 App.php
并重写 _map
函数。
我的问题:
是否可以覆盖受保护的函数或属性? 如果没有:
为什么在 CakePHP 中它们像
static::
一样被使用(或称呼)例如:static::_map($file, $className, $plugin);
但定义是protected static function _map($file, $name, $plugin = null)
如果是:我应该在我的应用程序中的什么地方定义扩展应用程序的 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 知识。仔细阅读这些链接,它们会给您答案,并希望您能完全理解这两个主题。
- http://php.net/manual/en/language.oop5.visibility.php
- http://php.net/manual/en/language.oop5.late-static-bindings.php
在 SO 上也有 很多 的问题和答案。如果手册不够用,就搜索它们。
三号没有固定位置。只需将它放在应用程序内的 Lib
或 Utility
文件夹中。但是,我会选择一个自动加载器而不是内置的 App
东西,只使用 uses
使我的 类 可用。如果您的应用程序还没有使用 composer,只需添加它并使用它的 autoader 和命名空间。 2.x 仍未使用它们的唯一原因是向后兼容性。 App
是一个拐杖,可以在不实际使用它们的情况下完成类似命名空间的功能。