2011-01-18 7 views
1

さて、私はこれを理解することをあきらめました。私は単純なフックシステムを作成しており、ファイルはhooks /というフォルダに置かれています。ここでPHP非オブジェクト上のメンバ関数への呼び出し

<?php 
//Testhook 
function exampleHook() { 
    echo 'Example hook as been run'; 
} 
//Register hook (start is the hook type (where to be called), exampleHook is the function //name and TRUE if it is enabled or not. 

$hooks->RegisterHook('start','exampleHook','TRUE'); 
?> 

を引っ掛けこのシステムは、ページにすべての機能をロードします例で、彼らはしかしまだ実行され文句を言いません。 callHooks機能がそれにタイプ「開始」で任意の機能を実行します

<?php 
    include ("hooks.class.php"); 
    $hooks = new hooks('hooks/'); 
?> 
<html> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
    <title>Hooks</title> 
</head> 

<body> 
    <p>Start hooks should run below</p> 
    <?php $hooks->callHooks('start'); ?> 
    <p>Start hooks should now finish</p> 
</body> 
</html> 

:のようなコードに見えるHERESにどのような実際のページで今

。私の問題は、testHook.phpでは$ hookクラスを見つけることができないということです。私はexampleHookを同じページに入れて関数を登録しましたが、完璧に動作しますが、何らかの理由で$ hookクラスを見つけることができません含まれています。任意の明確化のためだけに頼む:)これは本当に私を悩ませてきた、

Notice: Undefined variable: hooks in C:\wampserver64\www\Framework\library\addHooks\hooks\testHook.php on line 9 

Fatal error: Call to a member function RegisterHook() on a non-object in C:\wampserver64\www\Framework\library\addHooks\hooks\testHook.php on line 9 

ありがとう:

<?php 

class hooks { 

    //Variable Initialisation 
    private $hookDir; 
    private $allHooks; 
    public $debug = FALSE; 
    private $debugDetails = array(); 

    //Function runs when the class is called, sets the location and calls the function retrieveHooks() to include all the files 
    function __construct($hookDir = "library/addHooks/hooks/") { 
     $this->hookDir = $hookDir; 
     $this->allHooks = array(); 
     $this->retrieveHooks(); 
    } 

    public function retrieveHooks() { 
     //Get all files located in hooks directory 
     $hookFiles = scandir($this->hookDir); 
     //Loop through the files and remove any that arnt a file 
     foreach($hookFiles as $hookFile) { 
      if (strlen($hookFile) > 2) { 
       //Include the file into the page 
       include_once($this->hookDir . $hookFile); 
       // START DEBUG SECTION OF CODE // 
       if ($this->debug == TRUE) { $this->debugDetails[] = $this->hookDir . $hookFile . '<br />'; } 
       // END DEBUG SECTION OF CODE // 
      } 
     } 

    } 

    //Function is called by hook files to register themselves into the class file 
    public function registerHook($hookType,$functionName,$hookEnabled = TRUE) { 
     if ($hookEnabled == TRUE) { 
      $singleHook = array('type' => $hookType, 'function' => $functionName); 
      $this->allHooks[] = $singleHook; 
      // START DEBUG SECTION OF CODE // 
      if ($this->debug == TRUE) { $this->debugDetails[] = ($singleHook); } 
      // END DEBUG SECTION OF CODE // 
     } 
    } 

    //Execute the hooks based on the hook type, the programmer can add as many hooks as he wants 
    public function callHooks($hookType) { 
     //For each hook in the array 
     foreach($this->allHooks as $singleHook) { 
      //If hook is found for that type eg. start, end, middle 
      if ($singleHook['type'] == $hookType) { 
       //Call the function that is now included within the web page 
       call_user_func($singleHook['function']); 
       // START DEBUG SECTION OF CODE // 
       if ($this->debug == TRUE) { $this->debugDetails[] = ($singleHook); } 
       // END DEBUG SECTION OF CODE // 
      } 
     } 
    } 

    //Return the array of debug details 
    public function fetchDebugDetails() { 
     return $debugDetails; 
    } 

    //Test the class by outputting a simple message 
    public function testClass() { 
     $className = 'hooks'; 
     echo 'Class is working: ' . $className; 
    } 

} 

?> 

最後にエラーメッセージ:ここに

はフッククラスファイルです。インクルードファイルで

+1

注: '' TRUE''は文字列です。おそらくブール値: 'true'を使用したいと思います。 – Znarkus

+0

私は、通常ブール値でそこに行く変数を持っていますが、コードを減らす:)ありがとう – SamV

答えて

1

、あなたが

+0

多くの人に感謝、4分でありがとう:)私はちょっと混乱しているように、なぜこれが動作するのか詳しく説明できますか? – SamV

0

@keepwalkingが正しいクラスからファイルを含めるための代わりの

$hooks->RegisterHook('start','exampleHook','TRUE'); 

使用

$this->RegisterHook('start','exampleHook','TRUE'); 

これは、問題があるさフックファイルが含まれています。 "hooks"クラスの "retrieveHooks()"メソッド内にファイルをインクルードします。これは、フック内のコードが実行を開始する場所です。間違ったスコープにあるので "$ hook"変数にアクセスすることはできませんが、フックを追加するために呼び出すことができる "this this"変数にアクセスできます。

+0

ああ、このタイプの機能を実装するのは良い方法ですか、悪い方法ですか?ありがとう:) – SamV

+0

より多くの文脈なしに言うのは難しいです。それがうまくいくなら、それは十分に単純なように思え、私は単純な解決策が好きです。 – cmhudson