2010-10-01 65 views
1

這是我的第一個問題..是溫柔:)提取剛剛從PHP應用程序的接口,用於代碼完成

我的開發團隊爲PHP應用程序(也就是我建立的應用程序)的一部分。我們稱之爲我們的'核心代碼'。我們有一個獨立的團隊每天使用核心代碼,他們使用核心代碼開發其他網站。

現在是這樣的事情,目前我們給開發人員訪問核心代碼,一切都很好,但是將來我們打算使用PHPdoc來記錄代碼,然後我們不需要給他們實際的碼。

的問題就變成了,如果我們的開發商沒有實際的代碼,那麼他們的IDE的將不再給他們的代碼完成的利益。

現在,我使用NetBeans,我注意到,它存儲的文件,如Standard.php,這些只包含一個巨大的功能列表和它們PHP文檔上面,我的問題是這樣的:

沒有任何人知道的我可以生成這樣一組文件的方式?他們不需要包含任何代碼,他們應該刪除實際的PHP,並且留下所有類和PHPdoc。

任何幫助,非常感謝。謝謝。

+0

如果*「一切正常」*,只要繼續給他們的代碼。 – Gordon 2010-10-01 13:43:35

+0

@戈登,雖然沒有真正回答這個問題,但.. – Jeriko 2010-10-01 13:54:01

+0

@Jeriko這就是爲什麼它是一個*評論*而不是*答案* – Gordon 2010-10-01 14:00:30

回答

0

嗯,我可以理解你爲什麼要這樣做。但是它會使調試更加困難(因爲他們無法通過核心代碼跟蹤調用)。

但是,如果您確實想要這樣做,您可以創建一個使用token_get_all的發生器來獲取每個標記的所有標記文件,並寫一個新的只剩下適當的標記(接口,空代碼塊)...

要麼,要麼使用reflection來生成類。基本上爲每個類加載一個新的反射器,並且使用其方法生成代碼。例如,要生成方法:例如,生成方法:

foreach ($reflector->getMethods() as $method) { 
    $signature = $method->getDocComment() . "\n"; 
    $modifiers = $method->getModifiers(); 

    if ($modifiers & ReflectionMethod::IS_PUBLIC) { 
     $signature .= 'public '; 
    } elseif ($modifiers & ReflectionMethod::IS_PROTECTED) { 
     $signature .= 'protected '; 
    } elseif ($modifiers & ReflectionMethod::IS_PRIVATE) { 
     $signature .= 'private '; 
    } 
    if ($modifiers & ReflectionMethod::IS_STATIC) { 
     $signature .= 'static '; 
    } 
    if ($modifiers & ReflectionMethod::IS_ABSTRACT) { 
     $signature .= 'abstract '; 
    } 
    if ($modifiers & ReflectionMethod::IS_FINAL) { 
     $signature .= 'final '; 
    } 
    $signature .= 'function ' . $method->name.'('; 
    $params = array(); 
    foreach ($method->getParameters() as $param) { 
     $paramSignature = $param->name; 
     if ($param->isDefaultAvailable()) { 
      $paramSignature .= ' = ' . var_export($param->getDefaultValue(), true); 
     } 
     $params[] = $paramSignature; 
    } 
    $signature .= implode(', ', $params) . ') {}'; 
} 

這裏也有一些更多的工作要做(如類型提示等),但應該讓你開始...

+0

謝謝,這看起來就像我需要的東西。我從來沒有遇到過反射鏡課,我想知道是否有人曾經寫過一個應用程序來做這個。它可能是有用的。爲了解決調試問題,我們目前不使用任何調試工具,代碼正在部署到開發者的開發服務器上。 – 2010-10-02 09:29:49

0

剛剛在看看這個,我想我會後一對夫婦的調查結果。

首先,ircmaxell的解決方案絕對是我看到的最好的方式,使用反射類,不是我所遇到到現在爲止,他們看起來像實現我的目標的一個好方法。

其次,它不會出現任何人以前確實做到了這一點,我們顯然不能在普通的使用情況在這裏尋找。

我不知道如果我要還繼續前進,但如果我這樣做,那麼我想我會分享一個簡單的方法,我會用。

各反射類提供了__toString()的方法,稱爲所討論的PHP對象(類,方法或其他)被返回的表示時,但它不是PHP語法。所以要與此相應地,我認爲最好的方式實際使用reflectior在這種情況下它的子類:

class ReflectionClassRebuilder extends ReflectionClass{ 

/** 
* Comments (Including an auto generated comment 
* 
* Constants 
* 
* Static Properties 
* 
* Static Methods 
* 
* Properties 
* 
* Methods 
* 
*/ 


public function __toString() { 

    foreach($this->getMethods() as $method){ 
     //Build each of the methods, with comments as valid PHP syntax 
    } 

} 

} 


$reflection = new ReflectionClassRebuilder("Example_Class"); 

//Write $reflection 

(string) $reflection; //Returns the class for writing to a file. 

以防萬一,可以幫助任何人。

謝謝。