-1

我对面向对象的 PHP 非常陌生。我只是写了一个代码来练习,但它显示错误,例如

Notice: Undefined variable: type in F:\xampp\htdocs\testing\scope.php on line 10
Notice: Undefined index: in F:\xampp\htdocs\testing\scope.php on line 10

我认为这是因为$type这个错误即将到来。有人可以帮忙吗?提前致谢。

class Lookup {
    public static $items = array();
    public $x = '34';
    public $y = '26';

    public static function setItems($items, $x, $y) {
        $items[$type] = array(
                'x' => $this->x,
                'y' => $this->y);
    }

    public static function getSum() {
        $z = self::$items[$type]['x'] + self::$items[$type]['y'];
        return $z;
    }
}

echo Lookup::getSum();
4

2 回答 2

4

您的代码中有一些不一致的地方,我将介绍一下:

setItems()

  • 有 2 个参数$x$y,它们从未使用过。
  • 方法体引用了一个$type未定义的变量。
  • 该方法使用$this关键字,该关键字在静态方法中不可用(它们没有对象上下文)。

getSum()

  • 正如您已经发现的那样,$type不存在。你的意思是把它作为参数传入吗?

尽管未定义的变量问题与 OOP 没有直接关系,但我可以说您不太了解范式。查看 .php 上的 PHP 文档Classes and Objects

于 2013-10-13T14:28:20.017 回答
2

将类属性或方法声明为静态使它们无需实例化即可访问。声明为静态的属性不能用实例化的类对象访问(尽管静态方法可以)。

为了与 PHP 4 兼容,如果没有使用可见性声明,则属性或方法将被视为已声明为 public。

因为静态方法可以在没有创建对象实例的情况下调用,所以伪变量 $this 在声明为静态的方法中不可用。 来自 php.org

一种解决方案是将所有内容都变成静态的(这样您就可以Lookup::getSum()在不实例化类的情况下调用):

class Lookup{
  public static $items = array();
  public static $x = '11114';
  public static $y = '26';
  public static function setItems(){
    self::$items = array('x'=>self::$x ,'y'=>self::$y);
  }
  public static function getSum(){

    $z = self::$items['x'] + self::$items['y'];
    return $z;
  }
}
echo  Lookup::setItems();
echo  Lookup::getSum();

-> 您的方式不起作用的原因是因为在类方法中, (对象运算符)只能访问非静态属性:

$this->property(其中 property 是属性的名称)。

静态属性只能使用 ::(双冒号)访问:

自我::$属性

因此在您的代码中,您应该以这种方式访问​​变量(虽然不建议,因为它是一个非常糟糕的 OO 设计)

class Lookup{
  public static $items = array();
  public $x = '11114';
  public $y = '26';

  public function setItems(){
    self::$items = array('x'=>$this->x ,'y'=>$this->y);
  }

  public static function getSum(){
    $z = self::$items['x'] + self::$items['y'];
    return $z;
  }

}

$a = new Lookup();
$a->setItems();

echo Lookup::getSum();
//11140
于 2013-10-13T14:31:57.513 回答