2017-07-20 2 views
0

私はCakePHP 2.9.8を使って、7年前に書かれ、今まで開発された古いアプリケーションを開発しています。 残念ながら、最初の開発者はCakePHPのライブラリにいくつかのコードを追加し、CakePHPの3番目のバージョンに移行するために、アプリケーションの変更を転送する必要があります。いくつかの関数をオーバーライドしますcakephp(遅い静的バインディング)

変化の一つは、~\lib\Cake\Core\App.phpに位置App::loadであり、それはstatic::_map($file, $className, $plugin);を使用するように、私は、App.phpを拡張するクラスを作成し、_map機能を書き換えることができます。

私の質問:

  1. が保護された機能やプロパティをオーバーライドすることはできますか? なしの場合:例えばstatic::よう

  2. CakePHPの中で、彼らが使用(またはと呼ばれる)された理由:static::_map($file, $className, $plugin);が、定義はprotected static function _map($file, $name, $plugin = null) そうであればある:拡張私のアプリケーションでは、私はクラスFooのを定義する必要があり

  3. 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

1)保護されているすべての方法を無効にすることができます。 – DanielO

答えて

1

を。これらのリンクを注意深く読んで、あなたに答えを与え、うまくいけば、両方の話題の完全な理解を得るでしょう。

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

またSOの両方に関連した質問と回答のたくさんがあります。マニュアルで十分でない場合は、それらを検索してください。


3番は固定されていません。アプリ内のLibまたはUtilityフォルダに入れてください。しかし、私はAppのものに組み込まれたオートローダーを選択し、usesを使用してクラスを利用可能にします。あなたのアプリがコンポーザーをまだ使用していない場合は、それを追加し、オートローダーと名前空間を使用します。 2.xがまだそれらを使用していない唯一の理由は、下位互換性です。 Appは、実際にそれらを使用せずに機能性のような名前空間を得るための松葉杖です。

+0

私はちょうど私たちがPHPで保護された機能を無効にすることはできないと知りました** ** php **のOOPに関する深刻な知識不足はありません。リンクと説明をありがとう。 –

+0

私はそれが深刻だと考えています。これは、おそらくビジブルスコープキーワードを持つすべてのOOP対応言語ではほとんど同じですからです。私はこれを深刻な欠如と考えています。それは事実上、あなたが保護された、あるいは個人的なものを使用したいと思う特定のケースを理解し、書くことを止めることになります。それは攻撃的なものではありません。 – burzum

+0

ありがとう私の友人 –

関連する問題