2016-07-14 21 views
1

PHPで変数宣言に関する質問がありますが、私はこの質問がちょっとばかりかもしれないと知っています。私はそれを宣言せずテスト変数を使用することができますように思え、次のコードPHPコンストラクタで変数を初期化する前に変数を宣言する必要がありますか?

<?php 
    Class Test{ 
    function __construct(){ 
     $this->test = 'helloworkd'; 
    } 
    function test(){ 
     echo $this->test; 
    } 
    } 
    $test = new Test(); 
    $test->test(); 

を持っています。私の質問は、変数にtest()メソッドがアクセスできる理由です。 テストはグローバル変数ですか?

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

+3

グローバルではありませんが、 '$ this->'を使用しているため、クラスのプロキシとして作成しています。 PHPで正式にプロパティを宣言する必要はありません。 **しかし、クラスをより見やすくするために**を使用することを知っているプロパティを宣言することは良い考えです。クラスを修正したいときは、その行を6ヶ月下に置いてください。 – RiggsFolly

+2

良いですあなたがそれを宣言すれば、それはIDEのオートコンプリートに役立ちます。 – vaso123

+2

PHPマジックメソッドについても検索することができます – dios231

答えて

0

私の質問は、test()メソッドがテスト変数にアクセスできる理由です。

PHPは他の言語とは異なり、最初に宣言することなく変数に値を割り当てることができます。通訳はあなたのためにそれらを初期化します。これは難しいコードを読んで、デバッグすることができますので、貧しい人々の練習で、あなたがしようとした場合、それはエラーが発生する可能性があるため宣言されなかった変数読み:

<?php 
$nonexistentArray['key'] = 7; //Bad practice, but PHP won't complain 
$a = $fakeArray['key']; //Undefined variable error 

でも後者の場合には、PHPが続行されます残りのスクリプトを実行するが、それは文句を言うだろう。

テストはグローバル変数ですか?

いいえ。ローカルスコープに存在します。

<?php 
function myFunc(){ 
    //$arr was never declared, but PHP won't complain 
    $arr['key'][]=7; 
} 
myFunc(); 

//Undefined var error. The $arr that was initialized in myFunc is not global 
print_r($arr); 

宣言していない変数を使用しようとすると、いいIDEが表示されます。あなたの場合、コンストラクタ内では次のようになります。

$this->test = 'helloworkd'; 

PHPはこのクラスプロパティを初期化します。コードの残りの部分は、test()メソッドを含むこれを使用できます。それがグローバル変数のように見える場合は、そうではありません。それはクラスプロパティです。クラスの外からtestとしてアクセスしようとすると、あなたはできなくなります。 $test->testまたは$this->testにアクセサー演算子->を使用する必要があります。

+0

ありがとうございます。私はちょうどあなたの答えに基づいていくつかのテストをしました。
$ this-> arr ['key'] []に$ arr ['key'] [] = 7が変更された場合、myFunc()は$ thisのためにクラスプロパティを作成しますキーワード? –

+0

非常に良いテスト:-) – BeetleJuice

0

多くの「テスト」!コンストラクタにasign test = "helloworld"があるので、新しいTest()が作成されるたびに値が必要になります。

$x = new Test(); 
$y = new Test(); 

echo $x->test(); //"helloworld" 
echo $y->test(); //"helloworld" 
0

私は変数を宣言します。これにより、自分のコードを参照する他の人がコードをより読みやすくなります。例えば

<?php 
    Class Test { 
    public $test; 
    function __construct($test){ 
     $this->test = $test; 
    } 
    function test(){ 
     echo $this->test; 
    } 

だから今、私たちは $ instance->テストを呼び出すことにより、このクラスのインスタンスを介してアクセス可能なパブリック変数を持っています。あなたは、これは、あなたがプライベートまたは保護 にパブリック変更することができますしたくない場合は

あなたはこのここについて読むことができます。このクラスのインスタンスを作成するときに引数として渡すものは何でもhttp://php.net/manual/en/language.variables.scope.php

が割り当てられます$テスト変数。

0

私の質問は、test()メソッドがテスト変数にアクセスできる理由です。

できません。 testという定数にアクセスしようとしていますが、クラス変数にアクセスする場合は、$this->testを使用してください。例えば

<?php 
echo foo; 

は文字列 "foo" を出しエコーとも通知を出してくれるのでしょう:未定義の定数FOOの使用 - 仮定 'foo' で中...

+0

はい、あなたは正しいです、私はちょうど私の質問の編集を受け入れる。 $ this-> testにする必要があります –

0
<?php 
class test{ 
public $test; 
public function __construct(){ 
$this->test = 'helloworkd'; 
} 
$newtest = new Test(); 
echo $newtest->test; 
?> 
+0

このコードは質問に答えるかもしれませんが、本当に説明を追加する必要があります。 – BDL

+3

このコードスニペットは問題を解決するかもしれませんが、[説明を含めて](// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)本当にあなたの投稿の質を向上させるのに役立ちます。将来読者の質問に答えていることを覚えておいてください。そうした人々はあなたのコード提案の理由を知らないかもしれません。また、コードと説明の両方の可読性が低下するため、説明的なコメントを使用してコードを混乱させないようにしてください。 – FrankerZ

関連する問題