多次调用函数 - 无法重新声明类 - php

时间:2010-10-31 08:23:46

标签: php oop

我正在学习php,我正在测试oop和类。

我的代码是:

<?php 
require('user.php');
$user = new User($username);
$projects = $user->getProjects();

for ($n = 0; $n<count($projects); $n++) {
    echo "<li>";
    echo "<a id=\"menu_pages\" href=\"\"><img src=\"../images/types/project.png\"/>" . $projects[$n]->name . "</a>";

    echo "<ul>";
    $items = $user->getItems($n);
    for ($i = 0; $i<count($items); $i++) {
        echo "<li><a href=\"../\"><img src=\"../images/types/" . $items[$i]->type . ".png\"/>" . $items[$i]->name . "</a></li>";
    }
    echo "</ul>";
    echo "</li>"; 

}
?>

我收到错误: 致命错误:无法在第2行的/home/ios/public_html/classes/item.php中重新声明类别

我发现它是因为我正在使用

$items = $user->getItems($n);

循环。因为如果我将其改为

$items = $user->getItems(1);

它有效。无论如何我都无法弄清楚错误。

请帮助:)

提前致谢。

方法:

    function getItems($parent,$type = NULL) {
    $items = array();
    $username = $this->uname;

    $userid = $this->getId($username);

    include('classes/config.php');


    if ($type != NULL) {
    }

    require_once('classes/item.php');

    foreach ($pdo->query($sql) as $row) {
        $instance = new Item();
        $instance->name = $row['name'];
        $instance->id = $row['id'];
        $instance->type = $row['type'];
        $instance->parent_id = $row['parent_id'];

        $items[] = $instance;
        unset($instance);
    }

function getProjects() {
    $projects = array();
    $username = $this->uname;

    $userid = $this->getId($username);

    include('classes/config.php');


    require_once('classes/project.php');

    foreach ($pdo->query($sql) as $row) {
        $proj = new Project();
        $proj->name = $row['name'];
        $proj->id = $row['id'];

        $projects[] = $proj;
        unset($proj);
    }

    return $projects;  

}

编辑:

它还没有改变它。代码经历没有错误,但现在第一个应该在第二个下面,第一个是空白。看到我逻辑中的任何问题?

5 个答案:

答案 0 :(得分:2)

使用require_once同时包含具有类定义的文件(我想这将在getItems()中的某个位置)或组织您的文件并定义魔术函数__autoload(),它将在您使用时加载它

在查看提供的来源后,我怀疑这是否适用于多行......

在这里你甚至在检查是否有任何项目之前创建了Item的实例,并且在第一个循环$instance被销毁之后:

require('classes/item.php');
            $instance = new Item();

foreach ($pdo->query($sql) as $row) {
    $instance->name = $row['name'];
    $instance->id = $row['id'];
    $instance->type = $row['type'];
    $instance->parent_id = $row['parent_id'];

    $items[] = $instance;
    unset($instance);
}

这应该是:

require_once('classes/item.php');

foreach ($pdo->query($sql) as $row) {
    $instance = new Item();
    $instance->name = $row['name'];
    $instance->id = $row['id'];
    $instance->type = $row['type'];
    $instance->parent_id = $row['parent_id'];

    $items[] = $instance;
    unset($instance);
}

因此,每个项目都会创建新实例。

答案 1 :(得分:1)

将其更改为require_once('user.php');,并且不会尝试在每次传递时执行user.php。

答案 2 :(得分:1)

很难说看到getItems()函数中的内容,但它可能包含一个文件,其中Item类在循环中定义,从而触发此错误。请尝试使用require_once()。

答案 3 :(得分:1)

错误消息指向重复的类定义(以Class classname开头的蓝图)。

如果你指的是正确的代码行 - 我并不相信你是 - 我很确定$user->getItems()包含一个PHP文件,其中重新定义了类。

可以使用require_once()include_once()修复即时问题,但您应该更改getItems函数,以便首先将类定义加载到其他位置。

答案 4 :(得分:1)

我猜测getItems()类上的User函数可能有类似的行:

require('item.php');

如果您将其更改为:

require_once('item.php');
你应该好好去。

(如果我错了,那么请发布getItems()函数的代码,以便我们进一步诊断。