我需要声明一个变量,然后在PHP构造函数中初始化它
我有一个关于变量声明在PHP中的问题,我知道这个问题可能有点愚蠢。我有以下代码我需要声明一个变量,然后在PHP构造函数中初始化它
<?php
Class Test{
function __construct(){
$this->test = 'helloworkd';
}
function test(){
echo $this->test;
}
}
$test = new Test();
$test->test();
好像我可以使用测试变量未声明的。我的问题是为什么test()方法可以访问测试变量? 测试是一个全局变量吗?
感谢您的帮助!
我的问题是为什么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
中的访问器运算符->
。
谢谢。我只是根据你的回答做了一些测试。
如果myFunc()处于Class上下文中,并且$ arr ['key'] [] = 7更改为$ this-> arr ['key'] [],它将创建一个类属性,仅仅因为$ this关键词,对吧? –
非常好的测试:-) – 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 - 中...
是的,你是对的,我只是接受我的问题的编辑。应该是$ this-> test –
<?php
class test{
public $test;
public function __construct(){
$this->test = 'helloworkd';
}
$newtest = new Test();
echo $newtest->test;
?>
假设 '富'
不是全局的,因为你使用了'$ this->',所以它已经将它创建为类的一个样本。这是真的,你不必在PHP中正式声明一个属性。 **但是,宣布你知道你将要使用的属性是一个好主意**,因为它使得一个类对其他人更具可读性,并且当你想修改类时,你需要6个月的时间。 – RiggsFolly
更好如果你声明它,因为它有助于IDE自动完成。 – vaso123
您还可以搜索PHP魔术方法 – dios231