2017-08-08 17 views
0

私は古いPHPプロジェクトの管理に取り組んでいます。 PHPプロジェクトはKohanaフレームワークを使用しています。私はPHP開発者のためのEclipse Oxygenをインストールし、それらのPHPコードを含むPHPプロジェクトを作成しました。しかし、私は、Eclipse OxygenがKohanaフレームワークによって自動ロードされたクラスへの参照を解決できないために、数多くのエラーを検出することを発見しました。 KohanaはPHPのオートローディング機能を利用してクラス名を変更するためです。たとえば、common.phpcommon_Coreというクラスがあります。 Kohanaはクラスをオートロードし、クラス名をcommonに変更しました。 common.phpのでEclipseはKohanaフレームワーク(PHPフレームワーク)によってオートロードされたクラスを解決できません

client.php

class common_Core { 
    public static function myFunc1() { 
     . . . 
    } 
} 

、我々は名前だけcommonでこのクラスを参照します。解決とcommon_Coreに変更することが示唆されていて

$result = common::myFunc1(); 

Eclipseの酸素はcommonをマークします。他のEclipseバージョン(Mars、Neon)ではそれらをエラーとしてマークしませんが、Ctrlキーを押しながらクリックするとそのメソッドにジャンプすることはできません。誰か独自のクラスを読み込むためにKohanaフレームワークのオートロード機能を使用していますか?あなたのクラスを解決するにはどうすればよいですか?

前述したように、これは古いプロジェクトで、たくさんのPHPコードが含まれています。したがって、すべての参照をcommon::からcommon_Core::に変更することは、おそらく良い解決策ではありません。

P.S.私はちょうどcommon_Coreからcommonにクラス名を変更する考えがあり、それはEclipseの問題を修正するようです。しかし、ネームスペースを使用しない限り、クラス名が他のライブラリと競合する危険性もあります。この古いPHPプロジェクトは名前空間を使用しません。とにかく、EclipseがKohanaフレームワークを使ってPHPプロジェクトと連携する方法があるかどうかを知りたがっています。

答えて

0

特に、common.phpという名前のファイルにcommon_Coreという名前のファイルがあると、奇妙な自動読み込みがあるようです。名前空間を使って新しいスクリプトで新しい標準を作ることはできませんか?私はあなたのオートローダーがこの標準を扱うことができると思います。

/vendor/Common/Core.php

namespace Common; 

class Core 
    { 
     public static myFunc() 
      { 
      } 
    } 

client.php

# Reassign the class to "common" if need be 
use \Core\Common as common; 
# Assign 
$result = common::myFunc(); 

または多分ちょうど働くかもしれないuseを使用していますか?

# Reassign the class to "common" if need be 
use \common_Core as common; 
# Assign 
$result = common::myFunc(); 

あなたがtheir manual hereを見る場合も、それは言う:

ロードされていないクラス(例えば:によりsession_cookie)を呼び出すとき、KohanaのはKohanaのを使用してファイルシステムを検索します::用FIND_FILEクラス/セッション/ cookie.phpという名前のファイル。

クラスがこの規約に準拠していない場合、Kohanaによってオートロードすることはできません。手動でファイルを追加するか、独自のautoload functionを追加する必要があります。

+0

はあなたのフィードバックをいただき、ありがとうございます。あなたのコメントで述べたKohanaのマニュアルを読みましたが、class "common_Core"を "common ::"と "email_Core"クラスでどのように参照できるか分かりません。 "email ::"で参照できます。私はこの古いPHPプロジェクトとKohanaフレームワークそれでもコード構造を理解しようとする。しかし、このコードは長年にわたって生産されてきました。したがって、その参照が機能しなければなりません。たぶん、元の開発者はクラス名エイリアスをどこかに行ったでしょう。もっと深く掘り下げて報告する。しかし、私の直感は、それがKohanaフレームワークに関連していなければならないということです。 – Raymond

+0

ええ、Kohanaのオートローダーはかなり簡単ですが、開発者が何らかの '__callStatic()'を実行した可能性は非常に高いです。プロジェクトを見ずに、私はより良い方向を与えることができませんでした... – Rasclatt

+0

私はコードのトレースを行い、最終的になぜか分かりました。 system/core/Kohana.phpでは、コードロジックは "common extends common_Core {}"という文字列を保持する変数を作成します。次に、eval()メソッドを使用してこの変数を出力します。したがって、 "common_Core"から拡張されたこの "共通"クラス定義を動的に作成します。 eval()行の上のコメントは次のように述べています: "透明なクラス拡張はevalを使って処理されます。これは嫌なハックですが、それは仕事を終わらせます。" IMHO、この種のクラスエイリアスは悪い習慣です。これで、実行時にその行を解釈するまで、Eclipse IDEはクラス定義を持ちません。 – Raymond

0

Kohanaのフレームワークは、特定の接尾辞(例えばcommon_Core - >commonemail_Core - >email)との自動ロードのクラスの実行時にeval()を使用してエイリアスクラス名を作成するようです。なぜエイリアス名が必要なのか不明です。その習慣は、名前の競合のリスクを高めるだけでなく(古いPHPコードでは名前空間を使用しない)、EclipseとEclipseはこれらの別名をエラーとしてマークしてしまいます。 eval()では、エイリアスクラス名が実行時に決定されるため、Eclipse(またはPHP IDE)がそのエイリアスクラス名を確認する方法はありません。簡単な解決策は、後置を削除することです。たとえば、クラスcommon_Coreの名前をcommonに変更します。その後、副作用なしにKohanaフレームワークを使用することができます。

Kohana.php:

. . . 
. . . 
     if ($filename = self::find_file($type, self::$configuration['core']['extension_prefix'].$class)) 
     { 
      // Load the class extension 
      require $filename; 
     } 
     elseif ($suffix !== 'Core' AND class_exists($class.'_Core', FALSE)) 
     { 
      // Class extension to be evaluated 
      $extension = 'class '.$class.' extends '.$class.'_Core { }'; 

      // Start class analysis 
      $core = new ReflectionClass($class.'_Core'); 

      if ($core->isAbstract()) 
      { 
       // Make the extension abstract 
       $extension = 'abstract '.$extension; 
      } 

      // Transparent class extensions are handled using eval. This is 
      // a disgusting hack, but it gets the job done. 
      eval($extension); 
     } 

. . . 
. . . 

P.S. Kohanaフレームワークを詳細に読んだ後、eval()がいわゆるTransparent Class Extending機能を実装するために使用されていることがわかりました。

Transparent Class Extending:以下の2つのリンクをご参照くださいhttps://v2docs.kohanaframework.org/3.3/guide/kohana/extension

Cascading FileSystemhttps://v2docs.kohanaframework.org/3.3/guide/kohana/files

私はそれが私たちの古いコード内のKohanaフレームワークの誤った使用である見つけました。 _Coreの接尾辞を持つクラスは、Kohanaのコアクラス用に予約されているため、宣言するべきではありません。 common_Coreコハナクラスがないので、commonと名付けてください。しかし、email_Coreコハナクラスがあるので、クラスemailemail_Coreに拡張する必要があります。アプリケーションディレクトリに

class common { 
// there is no common_Core in Kohana 
} 

class email extends email_Core { 
// there is email_Core in Kohana 
} 

はとにかく、私はまだ悪い習慣と危険であるeval()関数を使用してだと思います。透明クラス拡張を間違って使用すると、Kohanaフレームワークは他のPHP IDEと互換性がありません。

は同じ問題を議論する他の同様の投稿が見つかり: http://forum.kohanaframework.org/discussion/212/can-developers-remove-evalclass-class-extends-class-_core-/p1

関連する問題