我对OOP非常新,我在第一次实现__constructor方法时遇到了一些错误。这两个错误是:
Notice: Undefined variable: _test in...
Fatal error: Cannot access empty property in ...
这是我的代码:
<?php
class Info
{
private static $_test;
public function __construct()
{
$this->setIt(); //call setIt so $_test can be set to true or false for use by other functions in the class.
}
public function setIt()
{
if ("test" == "something") //simplified logic for demo purposes
$this->$_test = TRUE;
else
$this->$_test = FALSE;
}
public function getIt()
{
if ($this->$_test) { //if test is true or false do stuff/other stuff
//do stuff
} else {
//do other stuff
}
}
}
$myObj = new Info(); //initialise the object
?>
<?php echo $myObj->getIt(); ?> //surrounded by html in my original code. Here I am getting some 'stuff' or 'other stuff' depending on what setIt() returned to $_test.
很抱歉,如果这有点令人费解。
答案 0 :(得分:1)
答案 1 :(得分:1)
您在开头使用$访问您的财产。访问对象范围中的对象属性时,您不需要使用$
。但是,您已将$_test
声明为静态,因此您可以使用self::$_test
class Info
{
private static $_test;
public function __construct()
{
$this->setIt();
}
public function setIt()
{
if ("test" == "something"){
self::$test = TRUE;
} else {
self::$test = FALSE;
}
public function getIt()
{
if (self::$_test) {
//do stuff
} else {
//do other stuff
}
}
}
$myObj = new Info(); //initialise the object
echo $myObj->getIt();
答案 2 :(得分:1)
您将$_test
定义为static
,因此您应该将其视为:
self::$_test
或
static::$_test
但是,吸气剂和制定者应该是有意义的,并以它们包装的字段命名[即getTest()
,setTest($value)
],即使您只是提供示例案例。
如果您是OOP的新手,在理解实例与static
属性和方法之间的区别时,您将遇到一些麻烦。
让我们假装有一个Circle
类,它拥有中心和半径:
class Circle
{
public static PI = 3.141592653589793;
private $x;
private $y;
private $radius;
public function getX(){ return $this -> x;}
public function setX($x){ $this -> x = $x;}
public function getY(){ return $this -> y;}
public function setY($y){ $this -> y = $y;}
public function getRadius(){ return $this -> radius;}
public function setRadius($radius){ $this -> radius = $radius;}
public function __construct($x, $y, $radius)
{
$this -> setX($x);
$this -> setY($y);
$this -> setRadius($radius);
}
public function getArea()
{
return $this -> radius * $this -> radius * self::PI;
}
public function getLength()
{
return 2 * self::PI * $this -> radius;
}
}
x
,y
和radius
对于您构建的每个圆[类的实例]都不同:它们是实例变量:
$firstCircle = new Circle(0,0,10);
$secondCircle = new Circle(5,5,2);
...
另一方面,PI
是静态的,因为它属于类本身:对于每个圆,它保持长度/直径比为3.1415 ......
你会发现静态属性和方法在OOP中有更广泛的用途,但这足以让你第一眼看到它。