PHP面向对象数组未打印

时间:2016-10-31 11:34:49

标签: php oop

好吧,所以我手上有两个问题,那些是

  • 我想从父对象调用该函数但是我收到很多错误说"致命错误:无法实例化抽象类Person"
  • 如果我直接调用getUserItems,它将不会执行任何操作。不会有任何回声等等。


<?php

    abstract class Person {
        abstract function getUserItems();
    }

    class inventory extends Person {

        protected $storage = array();
        protected $item_id;

        public function itemAdd($itemname) {
            $storage[$this->item_id+1] = $itemname;
        }

        public function getUserItems() {
            foreach($this->storage as $itemName=>$item_id) {
                echo $itemName." ".$item_id."<br/>";
            }
        }
    }

    $user = new Person();

    $user->getUserItems();

    /*$user = new inventory();
    $user->itemAdd("Item 1");
    $user->itemAdd("Item 2");

    $user->getUserItems();*/

?>

3 个答案:

答案 0 :(得分:1)

在OOP中 - 抽象类may not be instantiated

  

An abstract class是一个包含将继承的实现和接口(纯虚方法)的类。接口通常没有任何实现,只有纯虚函数。

所以你无法实例化(new Person())。您必须扩展此抽象类并实现它的abtract函数(与库存中的方法相同)。

关于echo问题 - 在您的itemAdd函数中,您没有使用对象的$storage成员(您只使用了本地$storage变量)。您应该使用$this->storage

将其用作对象的memebr
public function itemAdd($itemname) {
    $this->storage[$this->item_id+1] = $itemname;
}
  

请注意,我不确定您是如何管理$this->item_id成员的,因为您未在代码中设置/更改它。

如果您只想向storage成员添加新项目,可以使用:

$this->storage[] = $itemname;

这将确保每个新项目都会添加到$storage数组。

答案 1 :(得分:0)

AD1)

Person是抽象类,因此您无法创建该类的对象。

AD2)

您必须使用$this

所以不是:

 $storage[$this->item_id+1]

$this->storage[++$this->item_id]

在这里我修复了另一个错误,即$ this-&gt; item_id + 1

答案 2 :(得分:0)

抽象类不能直接访问,而是从其他类访问。​​

abstract class Person {
    abstract function getUserItems();
}

class inventory extends Person {

    protected $storage = array();
    protected $item_id=2;

    public function itemAdd($itemname) {
        $storage[$this->item_id+1] = $itemname;
    }

    public function getUserItems() {
        foreach($this->storage as $itemName=>$item_id) {
            echo $itemName." ".$item_id."<br/>";
        }
    }
}

$user = new inventory();

$user->getUserItems();

$user = new inventory();
$user->itemAdd("Item 1");
$user->itemAdd("Item 2");

$user->getUserItems();