2013-10-13 18 views
-1

我对面向对象的PHP很新颖。 我只是写了代码练习,但它显示错误,如PHP示波器分辨率运算符:此代码显示很多错误,由于第10行代码

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(); 
+7

'$ type'从哪里来?这不是一个OOP问题。 –

+0

你使用哪个PHP版本? [*后期静态绑定*](http://php.net/manual/language.oop5.late-static-bindings.php)5.3中介绍的 –

+1

乔治说这不是一个面向对象的问题。代码中的'$ type'变量在这里不存在! –

回答

4

有几个不一致的在你的代码,我将贯穿:

setItems()

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

getSum()

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

即使未定义的变量问题与OOP没有直接关系,我可以告诉你不太了解这个范例。查看Classes and Objects上的PHP文档。

2

将类属性或方法声明为静态使它们可访问 而不需要实例化该类。声明为 静态的属性无法通过实例化的类对象进行访问(尽管静态方法可以使用 )。

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

因为可以调用静态方法而不创建对象 的实例,所以伪变量$ this在声明为静态的方法 内不可用。 from 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 
+0

想想你的第一个例子实际上是如何流动的。这是一个**糟糕的**解决方案。 –

+0

@GeorgeBrighton我只是想向OP演示你需要'self ::'用于静态变量,'$ this->'用于非静态变量。 –

+0

注意消除反对票?否则,我宁愿让这个答案不被接受,所以我可以删除它。 –