在PHP构造函数中初始化变量之前是否需要声明变量

时间:2016-07-14 11:42:33

标签: php

我对PHP中的变量声明有疑问,我知道这个问题可能有点愚蠢。我有以下代码

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

似乎我可以使用测试变量而不声明它。我的问题是为什么test()方法可以访问测试变量? 测试是全局变量吗?

感谢您的帮助!

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

很多&#34;测试&#34;!你有asign test =&#34; helloworld&#34;在构造函数中,每个新的Test()都需要一个值。

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

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

答案 2 :(得分:0)

我会声明你的变量。这使代码对于您自己看到代码的任何其他代码更具可读性。

例如:

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

所以现在我们有一个可以通过调用此类的实例访问的公共变量 $实例 - &GT;测试;

如果您不想这样,那么您可以将公共更改为私有或受保护 你可以在这里阅读:http://php.net/manual/en/language.variables.scope.php

无论您在创建此类的实例时作为参数传递的内容都将分配给$ test变量。

答案 3 :(得分:0)

我的问题是为什么test()方法可以访问测试变量?

它不能。它正在尝试访问常量test,如果要访问类变量,请使用$this->test

例如:

<?php
echo foo;

将回显字符串“foo”并发出通知:使用未定义的常量foo - 假设'foo'在......

答案 4 :(得分:0)

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