无法使用OOP修复一些错误:与构造函数调用函数有关

时间:2013-05-28 11:15:15

标签: php oop

我对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.

很抱歉,如果这有点令人费解。

3 个答案:

答案 0 :(得分:1)

替换

$this->$_test = TRUE;

$this->_test = TRUE;

您编码的每个地方。

使用$this时,$不会与属性名称

一起使用

thread可能很有用。

答案 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;

  }

}

xyradius对于您构建的每个圆[类的实例]都不同:它们是实例变量

$firstCircle = new Circle(0,0,10);
$secondCircle = new Circle(5,5,2);
...

另一方面,PI是静态的,因为它属于类本身:对于每个圆,它保持长度/直径比为3.1415 ......

你会发现静态属性和方法在OOP中有更广泛的用途,但这足以让你第一眼看到它。