2017-08-08 105 views
0

我被分配去維護一箇舊的PHP項目。 PHP項目使用Kohana框架。我爲PHP開發人員安裝了Eclipse Oxygen,並創建了一個包含這些PHP代碼的PHP項目。但是,我發現Eclipse Oxygen由於無法解析Kohana框架自動加載的類的引用而出現大量錯誤。因爲,Kohana利用PHP的自動加載功能並更改類名稱。例如,我們在common.php中有一個名爲common_Core的類。 Kohana自動加載課程並將課程名稱更改爲commonEclipse無法解析由Kohana框架自動加載的類(PHP框架)

在的common.php:

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

client.php,我們只是引用這個類名common

$result = common::myFunc1(); 

Eclipse的氧氣將迎來common如不解決,並建議更改爲common_Core。其他Eclipse版本(火星,霓虹燈)不會將這些標記標記爲錯誤,但不能使用Ctrl單擊跳轉到該方法。有人使用Kohana框架的自動加載功能來加載你自己的類嗎?你如何讓Eclipse來解決你的課堂?

如前所述,這是一箇舊的項目包含大量的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,它說:

當調用尚未加載的類(如:會話cookie的),Kohana的使用會Kohana的:: find_file一個搜索文件系統文件名爲classes/session/cookie.php。

如果你的課沒有遵循這個約定,他們不能被Kohana自動加載。您將不得不手動添加您的文件,或者添加您自己的文件autoload function

+0

感謝您的反饋意見。我在你的評論中讀過Kohana的手冊,並不完全瞭解「common ::」可以引用「common_Core」類,「email ::」類可以引用「email_Core」類。我對這個很老的PHP項目和Kohana框架。仍然嘗試瞭解代碼結構。但是,該代碼已經投入使用多年。所以,這個參考必須工作。也許,最初的開發者在別處沒有類名別名。將深入挖掘並回報。但是,我的直覺是它必須與Kohana框架相關。 – Raymond

+0

是的,開發人員很可能做了某種'__callStatic()',Kohana自動加載器看起來非常直截了當。沒有看到該項目,我無法給出更好的方向...... – Rasclatt

+0

我做了代碼跟蹤,並最終找出原因。在system/core/Kohana.php中,代碼邏輯將創建一個變量來保存字符串「common extends common_Core {}」。然後使用eval()方法來打印這個變量。所以,它動態地創建了這個從「common_Core」擴展的「通用」類定義。 eval()行上面的註釋表示:「透明類的擴展名是使用eval處理的,這是一個令人厭惡的黑客行爲,但它完成了工作。」恕我直言,這種類別別名是一種不好的做法。現在,Eclipse IDE在運行時解釋該行之前不會有類定義。 – Raymond

0

似乎Kohana的框架使用運行時eval()用於自動加載的類與某些後綴創建別名類名稱(例如common_Core - >commonemail_Core - >email)。不知道爲什麼需要別名。這種做法不僅會增加名稱衝突的風險(一些舊的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); 
     } 

. . . 
. . . 

附:詳細閱讀Kohana框架後,我發現eval()用於實現所謂的Transparent Class Extending功能。請看下面的兩個鏈接:

Transparent Class Extendinghttps://v2docs.kohanaframework.org/3.3/guide/kohana/extension

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

我發現它在我們的舊代碼錯誤使用Kohana的框架。我們不應該使用_Core後綴聲明任何類,因爲它們是爲Kohana核心類保留用於擴展。由於沒有common_Core Kohana班,我們應該把它命名爲common。但是,Kohana類有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