2010-10-31 97 views
0

我目前正在学习php,而且我正在测试oop和classes。多次调用函数 - 无法重新声明类 - php

我的代码是:

<?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>"; 

} 
?> 

,我得到的错误: 致命错误:不能联机重新声明类项目在/home/ios/public_html/classes/item.php 2

我发现它的,因为我在循环中使用

$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; 

} 

编辑:

它仍然没有改变与它的工作。代码通过没有错误,但现在应该在第一个下是第二个,第一个是空白。看到我的逻辑中的任何问题?

回答

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); 
} 

所以对于创建新实例的每个项目。

+0

编辑该帖子。它仍然无法改变它。代码通过没有错误,但现在应该在第一个下是第二个,第一个是空白。看到我的逻辑中的任何问题? – willium 2010-10-31 08:42:59

+0

不知道'first'和'second'是什么,但看到编辑答案 - 我纠正了你的getItems()方法,也许现在它会按预期工作 – 2010-10-31 08:57:38

+1

我添加了你的改变。我得到一个分析错误:语法错误,意外的';',期待T_FUNCTION在第89行上的/home/ios/public_html/classes/user.php(该类的最后一行是:?>) – willium 2010-10-31 09:09:24

1

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

+0

编辑帖子,它仍然不能改变它。代码通过没有错误,但现在应该在第一个下是第二个,第一个是空白。看到我的逻辑中的任何问题? – willium 2010-10-31 08:42:43

1

很难说看到getItems()函数中有什么,但它可能包含一个文件,其中Item类在循环中定义,从而触发该错误。尝试使用require_once()代替。

+0

发布了代码。 – willium 2010-10-31 08:38:31

1

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

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

可以使用require_once()include_once()修复即时问题,但您应该更改您的getItems函数,以便首先在别处加载类定义。

1

我想这对UsergetItems()功能可能有一行是这样的:

require('item.php'); 

如果把它修改成:

require_once('item.php'); 

你要善于去。

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

+0

我发布了代码。谢谢! – willium 2010-10-31 08:38:02

+0

是的,还有我说要查找的行:'require('classes/item.php');'。只需将其更改为'require_once('classes/item.php');'。在发布之前,你是否亲自(根据我的建议)自行寻找它? – Lee 2010-10-31 08:53:22

+0

我做过了,但我想快速发布代码。我得到一个解析错误:语法错误,意外的';',期待在89行上的/home/ios/public_html/classes/user.php中的T_FUNCTION(该类的最后一行是:?>) – willium 2010-10-31 09:10:27