2

私がこれをひどく説明し、それが意味をなさない場合、私は少し混乱しています。

PHPファイルの出力を特定の場所の別のファイルにインクルードできるようにしたいのですが、そのために、バッファーを使用してインクルード/リクワイアします。

 if (file_exists(CUSTOM_PHP_DIR."/".$filename)) {
   ob_start();
   include(CUSTOM_PHP_DIR."/".$filename);
   $html = ob_get_clean();
 }
 echo $html; //where I want the results to go.

問題は、上記をクラスのメソッドに含めたことです。したがって、ファイルにインクルードが含まれている場合、インクルードを実行$thisしたクラスのプロパティとメソッドが含まれます。これにより、インクルードの内容が完全に壊れます。これは次のとおりです。

myClass::getSomethingFromDatabase();

myClassは、データベースクラスの拡張機能であり、一連の処理を実行するようにそれ自体を呼び出すことを理解してい$thisます。$ thisは、ファイルを含む別のクラスへの参照になりました。

インクルードで使用するオブジェクトをインスタンス化することで、当面この問題を回避しました。これには、データベースのクレデンシャルが必要です。

$newObject = new myClass(DB_CREDENTIALS);
$newObject->getSomethingFromDatabase();

私はdefineデータベースのクレデンシャルを定数として取得する必要があり、それらをすばやく簡単に取得する必要がありましたが、それは避けたかったのです。静的呼び出しを機能させるためのより良い方法を見逃したことがありますか?

4

1 に答える 1

0

コメントから、コードを別の方法でリファクタリングしたことは理解しているようですが、元の質問に対する答えは、スコープ内のすべての変数を破棄するために、新しい関数コンテキストにインクルードすることでした。

次の例でわかるように、anonymous_include()はあなたが望むことをしているようです。

$ php test.php
Another class
bar
--
Direct include
$this exists
--
Anonymous include
$this does not exists

test.php:

<?php                                                                                  
class main                                                                             
{                                                                                      
  public function another_class()                                                      
  {                                                                                    
    $path = dirname(__FILE__).'/include.php';                                          

    if (!file_exists($path)) {                                                         
      die('The file does not exists :(');                                              
    }                                                                                  

    ob_start();                                                                        
    include($path);                                                                    
    $html = ob_get_clean();                                                            
    echo $html;                                                                        
  }                                                                                    

  public function direct_include()                                                     
  {                                                                                    
    $path = dirname(__FILE__).'/include_2.php';                                        

    if (!file_exists($path)) {                                                         
      die('The file does not exists :(');                                              
    }                                                                                  

    ob_start();                                                                        
    include($path);                                                                    
    $html = ob_get_clean();                                                            
    echo $html;                                                                        
  }                                                                                    

  public function anonymous_include()                                                  
  {                                                                                    
    $include = function() {                                                            
      $path = dirname(__FILE__).'/include_2.php';                                      

      if (!file_exists($path)) {                                                       
        die('The file does not exists :(');                                            
      }                                                                                

      ob_start();                                                                      
      include($path);                                                                  
      $html = ob_get_clean();                                                          
      return $html;                                                                    
    };                                                                                 
    echo $include();                                                                   
  }                                                                                    
}                                                                                      

$main = new main();                                                                    

echo "Another class\n";                                                                

$main->another_class(); // $this exists, but things seems to work fine                        

echo "--\nDirect include\n";                                                           

$main->direct_include(); // $this exists                                        

echo "--\nAnonymous include\n";             

$main->anonymous_include(); // $this exists

include.php:

<?php
class sub
{
  protected
    $foo = 'bar';

  public function foobar()
  {
    echo $this->foo."\n";
  }
}

$sub = new sub();
$sub->foobar();

include_2.php:

<?php
if (isset($this)) {
  echo "\$this exists\n";
} else {
  echo "\$this does not exists\n";
}
于 2012-07-12T18:19:42.873 に答える