2011-02-02 13 views
0

私は4つのクラスを持っています。誰かがprintHi.phpに行くと、別のクラスから「hi」を2回印刷します。しかし:PHPでクラスの関数を呼び出せません

printHi.php

include('main.php'); 
$main = new Main; 

main.php:

class Main { 
    function __construct() { 
     include('class2.php'); 
     include('class3.php'); 
     $this->class2 = new class2; 
     $this->class3 = new class3; 
     $this->class2->sanity(); 
    } 
} 

class2.php

class class2 { 
    public function sanity() { 
     echo "Hi."; 
    } 
} 

class3.php

class class3 { 
    function __construct() { 
     $this->class2 = new class2; 
     $this->class2->sanity(); 
    } 
} 

出力が表示されない(またはエラー)?私は間違って何をしていますか?私のクラスの全てでも

、私は正気を(使用したい場合)、どのように私はすべてのクラスで

$this->class2 = new class2; 
$this->class2->sanity(); 

を行わずいることだろうか?

http://pastebin.com/HHyQfvhW

+0

エラーを表示するためにアプリケーションの最初の行に 'error_reporting(0)'を追加すると、エラー報告はデフォルトでiniファイル内にあるように見えます。 – RobertPitt

答えて

2

エラーがスローされています。 error_reporting turned offが表示され、空白の画面が表示されている可能性がありますが、表示されています。ここで私が見ることができるものから、エラーのリストです:

  • Class3にのコンストラクタはfunction宣言が欠落しています。これは

    function __construct() { 
    
  • のClass1のコンストラクタは、非オブジェクト$this->classにメソッドsanity()を呼び出そうと致命的なパースエラーでなければなりません。これは致命的なエラーでなければなりません。

これは明らかに実際のコードではありません。すべてのクラスでClass2を利用できるようにすることを話していると仮定すると、Dependency Injectionをお勧めします。だから、:。

class Main { 
    public function __construct(class2 $class2, Class3 $class3) { 
     $this->class2 = $class2; 
     $this->class3 = $class3; 
     $this->class2->sanity(); 
    } 
} 
class Class2 { 
    public function sanity() {...} 
} 
class Class3 { 
    public function __construct(Class2 $class2) { 
     $this->class2 = $class2; 
    } 
} 

そうすれば、すべてが渡されたそれは、はるかに柔軟ですが、簡単には理解し、デバッグ、およびはるか簡単にテストすることにします。

編集:リンクされたコードに基づいて

いくつかの問題があります。

  • あなたの依存関係を注入してください。クラスの新しいインスタンスを作成しないでください(ハードコーディング関係)

  • コードを正しくインデントします。読みやすさは王様です。 常にインデント。

  • require() or die()は無意味です。 requireは、失敗した場合に実行を終了します。 or dieビットは冗長です。

  • Configsanity()メソッドはstaticと宣言されていますが、インスタンス上で呼び出そうとしています。インスタンスに結びつけられているかどうかを判断し(適切な場合は$thisを使用する必要があります)、それを適切に作成します。その後、適切に呼び出すだけです。 barがインスタンスメソッドの場合はFoo::bar()にコールしないでください。

  • require 'foo' or die()はどのように作業する必要があるので、あなたのtodoは間違っています。

  • 最後に、盲目的にこのようなrequireを使用していない... ORは高いprecidenceを持っているので、それはrequire ('foo' or die())として解釈されますので、あなたがrequire 1を得る理由です。代わりに、クラスを自動ロードするか、エラーが発生しないようにファイルがすでに必要な場合はrequire_onceを使用してください。

+0

これは私の実際のコードです。私はそれが長いので元のポストに入れたくないのですが、あなたが言ったタイプミスの一部は私の実際のコードにはありません。 http://pastebin.com/HHyQfvhW –

+0

@Derek:元の質問で編集してもよろしいですか?何が間違っているか把握することは有用で必要なことです(長さについて心配しないでください)。 – ircmaxell

+0

大丈夫です。 –

2

class class3 { 
    __construct() { 
     $this->class2 = new class2; 
     $this->class2->sanity(); 
    } 
} 

はパースエラーが含まれているため、あなたはおそらくエラーが表示されていません。つまり、function __construct()と書く必要があります。このため、構文エラーのためスクリプトが実行されないため、error_reportingini_setなどのエラーを有効にするメソッドは機能しません。したがって、php.iniファイルを見て、そこにerror_reportingとdisplay_errorsディレクティブを設定してください。それを済ませたら、エラーメッセージが表示されるはずです。

関連する問題