2011-05-05 19 views
10

おそらく関連:
Why don't PHP attributes allow functions?クラス定義でrequire *ステートメントを使用できないのはなぜですか?

恩赦私、これは以前に頼まれましたが、なぜあなたは、次のようなものを持つことができない場合:

class foo { 

require_once 'defines.php'; 

private $_server = DB_SERVER; 
private $_username = DB_USERNAME; 
private $_password = DB_PASSWORD; 
private $_database = DB_NAME; 
public $debug = false; 
public $_conn; 

function __construct() {       
    $connection = @mysqli_connect($this->_server, $this->_username, $this->_password, $this->_database); 
} 

... 

} 

乾杯、

編集なぜこの現象が存在し、なぜそれが不可能であるかを調べる。 投票はどのように終了するのですか?

EDIT2:また、クラスがPHPに追加された前にそれは、関数のスコープ内およびグローバルスコープの両方でrequireincludeファイルに可能であった。この

+1

関連:[PHP属性では機能が許可されないのはなぜですか?](http://stackoverflow.com/questions/3960323/why-dont-php-attributes-allow-functions) –

+0

青写真は確かですが、その青写真は反復を避けるために他のソースから静的な定義を取ることができなければならないでしょうか? – barfoon

+0

クラスの前に置くことができます。 – dqhendricks

答えて

5

再オープンしたいと思います。

これは私が言語設計者が来て、私達に彼らの物語—を伝えるためにするために、我々は以外に何ができる他に何か分からないが、私はそれが何のメリットは、この機能を追加することから得ないであろうと信じられていた想像するだけで推測—です特にバックエンドに追加された複雑さを考慮して、クラスを追加することによって作成された「新しいスコープ」にまで拡張されました。

require dファイル内で行われた宣言に対して有効範囲規則がどのようになるかは完全にはっきりしていません。

結論として、間違った質問をしていると思います。 「なぜこれはサポートされていないのですか? 「それはなぜサポートされるべきなのですか?」というより多くのケースです。

私は、これがほんの少し助けてくれることを願っています。

+0

'class'スコープは' function'でも 'global'スコープでもありません。 PHPがクラスを実装する前のように、今日のインクルードステートメントを使用することが可能です。新しいコンセプトが到着したことを除いて、何も変わらなかった。 – KingCrunch

+0

@ KingCrunch:それは私が言ったことです。私はそれをもっと明確にするために私の答えを編集しました。 –

2

"実際の"コードはまったく使用できないため、プロパティ、メソッド、および定数の定義のみが許可されているからです。インクルードステートメントは、他のすべてのコードと同様に、「主スコープ」(手続き型)関数およびメソッドに入れることができます。しかし、私の知る限りでは、その任意の言語でサポートされていない

class A { 
    var $a = 1 + 1; // Parse error: unexpected '+' 
} 

。例えば、javaはこのために静的コードブロックを使用します

class A { 
    private static int a = 0; 
    static { 
    a = 1+1; 
    } 
} 

PHPでは、クラス自体の後ろに静的なコードを置くだけです。

class A {} 
/* static */ { 
    // do something 
} 

そのない可能privateまたはprotectedstaticメンバーこのようにアクセスします。

+0

理解しやすい。私はその時点で "実コード"の定義が競合すると思います。引数は定義であり、静的定数は適格でなければならず、話すために追加の論理を含まない。 – barfoon

+3

C++の '#include '(プリプロセッサディレクティブとして)は、非常に緩やかな類推ではあるが、クラス定義の中を含めてどこにでも行くことができる。私はもちろん、インクルードされたファイルの内容の一部がそこでは有効でないかもしれないことを理解しています。 –

関連する問題