我需要声明一个变量,然后在PHP构造函数中初始化它

问题描述:

我有一个关于变量声明在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

我的问题是为什么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

谢谢。我只是根据你的回答做了一些测试。
如果myFunc()处于Class上下文中,并且$ arr ['key'] [] = 7更改为$ this-> arr ['key'] [],它将创建一个类属性,仅仅因为$ this关键词,对吧? –

+0

非常好的测试:-) – BeetleJuice

许多“测试”!你在构造器中有asign test =“helloworld”,所以它为每一个新的Test()做了一个值。

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

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

我会声明你的变量。这使得代码对于任何看到你的代码的任何其他人来说更具可读性。

例如:

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

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

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

不管你创建这个类的一个实例时作为参数传递将被分配给$测试变量。

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

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

例如:

<?php 
echo foo; 

回音必出一个字符串 “foo”,并吐出了一张告示:使用未定义的常量的foo - 中...

+0

是的,你是对的,我只是接受我的问题的编辑。应该是$ this-> test –

<?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