2016-05-04 18 views
0

問題がありますが、 'new class()'を作成せずにコンストラクタを呼び出せますか?それとも、多分これのための別の方法があります。PHPコンストラクタが呼び出されていません

<?php 

class a 
{ 
    public static $hello; 

    public function say() 
    { 
     return self::$hello; 
    } 

} 

class b extends a 
{ 
    public function __construct() 
    { 
     self::$hello = 'hello world'; 
    } 
} 


echo b::say(); 

?> 

を私はしてみています

$b = new b(); 
echo $b->say(); 

そして、それは仕事です。しかし、私は使用したいb::say();

私を助けることができますか?

ありがとうございました!

+2

なぜクラスをインスタンス化せずにコンストラクタを呼び出したいのですか?これが最初のコンストラクタの目的であるとすれば、純粋に静的メソッドで動作させたい場合は、静的プロパティを設定するためにコンストラクタを使用しないでください。 –

+0

@ MarkBaker私は別のファイル$ hello変数の値が異なります。だから私はちょうどb :: say();のように呼び出します。 c :: say(); 私のプロジェクトでは実際のコードではありませんが、論理は私の問題を解決するためのものです。申し訳ありませんが、私の英語は良くありません。ありがとうございました! – kresek

+0

多くの同じクラスを作成していて、$ helloの値が異なる場合は、オブジェクト指向が何であるか誤解していると思います。 –

答えて

0

はい、それはちょうどこのような発言()関数は静的にすることも可能である:静的なクラスのインスタンス化の必要なしにアクセスすることができますクラスメソッドを宣言

public static function say() 
{ 
    return self::$hello; 
} 

この例では、最近の静的バインディングのように見えます。ですので、return self::$hello;return static::$hello;

+0

私は私は答えようとしていて、私にとっては何も表示していませんでしたか? – Jek

+0

は$ helloに何も格納されていないためです。 –

+0

お返事ありがとうございます。私は前に試してみましたが、うまくいきません。 – kresek

0

に変更してみてください。これはあなたのために良いですか?

<?php 

class a { 
    public static $hello; 

    public static function say() { 
     return self::$hello; 
    } 
} 

class b extends a { 
    public function __construct() { 
     self::$hello = 'hello world'; 
    } 

    public static function factory() { 
     return new b(); 
    } 
} 

echo b::factory()->say(); 

?> 

実際には、コンストラクタを呼び出さずにこれを行う方法が見つかりませんでした。これは回避策のようです。 factoryは単なる名前です。名前を変更することができます。

calling class method (with constructors) without object instantiation in php

+0

ありがとうございました。私はそれを試してみます。たぶん私は 'b :: say() - > factory();'に変更することができます。 – kresek

0

は、あなたが求めている:は "私は ')(新しいクラス' を作成せずにコンストラクタを呼び出すことができますか?"
答え:いいえ。

...コンストラクタメソッドを呼び出し、各 新しく作成されたオブジェクト

あなたはを要求した上でこのメソッドを持つクラス「しかし、私が使用したいb::say();
b::say(); - 静的メソッドの呼び出しです。
非静的な親メソッドを静的にオーバーライドすることはできません。しかし、基本クラスclass aを再構成してsay()メソッドを静的にすることができます。

+0

お返事ありがとうございます。はい、私の質問はそれに似ています。しかし、コンストラクタを呼び出す必要はありません。私は別の方法を探します。 :) – kresek

+0

@kresek、ok、good luck – RomanPerekhrest

0
<?php 

class a 
{ 
    public static $hello; 

public static function say() 
{ 
    return self::$hello; 
} 

} 

class b extends a 
{ 
public function __construct() 
    { 
     self::$hello = 'hello world'; 
    } 
} 

あなたが欠落していた事は、あなたのnew class方法にあなたのコンテンツを追加するのに必要でした。 - ただ、そのようにそれを呼び出す:new classを呼び出し、コンストラクタを使用する場合

$b = new b('Some words'); 
echo $b->say(); 

- あなたはあなたが作っている新しいクラスのためにPARAMATERSにコンテンツを追加することになるでしょう。

__construct関数を呼び出しているかのように動作します。 - new class($a)を呼び出すと、オブジェクトを作成した後に__construct($a)関数が呼び出されます。

これが役に立ったと思っています:)

+0

まだコードをテストしていないので、 'self :: hello'は動作しないかもしれません。 – Jek

+0

今すぐ削除しないでください。 - 私は '$'でテストし、私のために働いた。 – Jek

+0

ありがとうございました。しかし、私の質問では、私は$ b = new b()を使いたくない。私はちょうどb :: say()コールしたい。 :D私はなぜそれを使いたいのかを更新します。 – kresek

関連する問題