私はCakePHP 2.9.8を使って、7年前に書かれ、今まで開発された古いアプリケーションを開発しています。 残念ながら、最初の開発者はCakePHPのライブラリにいくつかのコードを追加し、CakePHPの3番目のバージョンに移行するために、アプリケーションの変更を転送する必要があります。いくつかの関数をオーバーライドしますcakephp(遅い静的バインディング)
変化の一つは、~\lib\Cake\Core\App.php
に位置App::load
であり、それはstatic::_map($file, $className, $plugin);
を使用するように、私は、App.php
を拡張するクラスを作成し、_map
機能を書き換えることができます。
私の質問:
が保護された機能やプロパティをオーバーライドすることはできますか? なしの場合:例えば
static::
ようCakePHPの中で、彼らが使用(またはと呼ばれる)された理由:
static::_map($file, $className, $plugin);
が、定義はprotected static function _map($file, $name, $plugin = null)
そうであればある:拡張私のアプリケーションでは、私はクラスFooのを定義する必要がありAppと
load
関数の場合は、開発者の変更を削除したいと思っていますが、どこでFoo :: loadを書くべきですか?
私もここApp::load
機能置く:あなたはPHPでOOPにおける知識のいくつかの深刻な欠如を持っている
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)保護されているすべての方法を無効にすることができます。 – DanielO