0

PHPで独自のシンプルなフレームワークを作成しようとしています。問題はありませんが、問題が発生しています。

すべてをindex.phpにリダイレクトし、そこからクラスと関数のロードを開始します。クラスでセグメントを使用するまで、URLをセグメントに分割します。これは正常に機能します。

私はこのようなメインコントローラークラスを持っています:

class SimpleController {
    
    public function __construct()
    {
        global $uri;
        print_r($uri);
    }
  }  

$ uri変数は問題なく出力されますが、ホームページなどの新しいコントローラーを作成するときは、次のようにします。

class home extends SimpleController{

private $template = 'home'; // Define template for this page

public function __construct()
{
    parent::__construct();
}
    
public function index()
{        
    
 
   print_r($uri);
  $view = new View($this->template); // Load the template
     
}}

今、それは私にエラー、未定義の変数を与えます。親コンストラクターでグローバルにしたので、これはどのように可能ですか?

4

4 に答える 4

2

PHPでは「グローバル」を使用しないでください。コントローラーでパブリック変数を使用するだけです。

新しいコード:

abstract class SimpleController {
    public $uri;

    public function __construct($uri)
    {
        $this->uri = $uri;
    }
}

class home extends SimpleController{
    private $template = 'home'; // Define template for this page

    public function index()
    {
        $this->uri; //This is the URI
        $view = new View($this->template); // Load the template
    }
}

コントローラを作成するには、次を使用します。

$controller = new home();
$controller->uri = "URI";
$controller->index();

編集:これを使用したい場合は、ホームからコンストラクターを削除しました。これも$uriを渡します。

于 2012-12-05T11:00:45.220 に答える
1

それは悪いデザインです。グローバル状態に依存しないでください。代わりに、あなたの家の共同構造者に$uriを渡します。

于 2012-12-05T11:00:02.147 に答える
0

@ yes123が言うように、あなたのデザインは非常に悪いので、グローバル変数の使用を避けるべきです。それ以外の場合はglobal、グローバル変数を使用するときにすべての関数で使用する必要があります。コードを次のように変更します。

public function index()
{
  global $uri;       
  print_r($uri);
  $view = new View($this->template); // Load the template

}
于 2012-12-05T11:02:18.560 に答える
0

親コンストラクターでグローバルにしたので、これはどのように可能ですか?

global $uri;これは新しいスコープなので、アクセスする場合は、再度グローバル()としてマークする必要があります。

しかし、それは悪い設計です。メンバーまたはクラス変数を使用してください。

于 2012-12-05T11:00:54.690 に答える