2010-10-31 4 views
0

J'apprends actuellement php, et je suis en train de tester oop et classes.Appels multiples à la fonction - Impossible de redéclasser classe - php

Mon code est:

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

} 
?> 

et j'obtiens l'erreur: Erreur fatale: Impossible redéclarer classe article en /home/ios/public_html/classes/item.php sur la ligne 2

Je trouve que son parce que je utilise

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

dans une boucle. Parce que si je le change en

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

cela fonctionne. Je ne peux pas vraiment comprendre de toute façon de contourner l'erreur.

Aidez s'il vous plaît :)

Merci d'avance.

Les méthodes:

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; 

} 

modifier:

son ne fonctionne toujours pas avec le changer. Le code passe sans erreurs, mais maintenant ce qui devrait être sous le premier est sous le second et le premier est vide. Voir des problèmes dans ma logique?

Répondre

2

Utilisez require_once tout en incluant des fichiers avec la définition des classes (je suppose que ce sera quelque part dans getItems()) ou d'organiser vos fichiers et définir la fonction magique __autoload() qui chargera pour vous quand il est utilisé.

Après avoir examiné source fourni, je doute que cela fonctionne pour plus d'une ligne ...

Ici vous créer une instance de Item avant même de vérifier s'il y a des éléments, et après la première boucle $instance est détruite:

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

Cela devrait ressembler à:

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

Ainsi, pour chaque élément nouvelle instance est créée.

+0

a modifié cette publication . Cela ne fonctionne toujours pas avec le changement. Le code passe sans erreurs, mais maintenant ce qui devrait être sous le premier est sous le second et le premier est vide. Voir des problèmes dans ma logique? – willium

+0

Je ne sais pas ce que 'first' et' second' est mais voir la réponse éditée - J'ai corrigé votre 'getItems()' méthode, peut-être maintenant ça va fonctionner comme prévu –

+1

J'ai ajouté vos modifications. J'obtiens une erreur Parse: erreur de syntaxe, inattendue ';', attendant T_FUNCTION dans /home/ios/public_html/classes/user.php sur la ligne 89 (dernière ligne de la classe qui est:?>) – willium

1

changez-le en require_once('user.php'); et il n'essaiera pas d'exécuter user.php à chaque passage.

+0

édité le post, son ne fonctionne toujours pas avec le changement. Le code passe sans erreurs, mais maintenant ce qui devrait être sous le premier est sous le second et le premier est vide. Voir des problèmes dans ma logique? – willium

1

Il est difficile de dire sans connaître ce qu'il y a dans la fonction getItems(), mais il est possible qu'il inclue un fichier où la classe Item est définie dans une boucle, ce qui déclenche cette erreur. Essayez d'utiliser require_once() à la place.

+0

a publié le code. – willium

1

Le message d'erreur pointe vers une classe dupliquée définition (Le plan qui commence par Class classname).

Si vous pointez sur la bonne ligne de code - je ne suis pas convaincu que vous êtes - je suis à peu près sûr que $user->getItems() inclut un fichier PHP, dans lequel la classe est redéfinie.

Le problème immédiat peut être résolu en utilisant require_once() ou include_once() mais vous devriez probablement changer votre fonction getItems de sorte que la définition de classe soit chargée ailleurs en premier lieu.

1

Je suppose que la fonction getItems() de la classe User a probablement une ligne comme:

require('item.php'); 

si vous changiez cette:

require_once('item.php'); 

vous devriez être bon d'aller.

(si je me trompe à ce sujet, alors s'il vous plaît envoyer le code pour la fonction getItems(), afin que nous puissions diagnostiquer plus loin).

+0

J'ai posté le code. Merci! – willium

+0

oui, et il y a la ligne que j'ai dit de chercher: 'require ('classes/item.php');'. Changez simplement cela en 'require_once ('classes/item.php');'. L'avez-vous réellement recherché (selon ma suggestion) avant de l'afficher? – Lee

+0

Je l'ai fait, mais je voulais afficher le code rapidement. J'obtiens une erreur Parse: erreur de syntaxe, inattendue ';', attendant T_FUNCTION dans /home/ios/public_html/classes/user.php à la ligne 89 (dernière ligne de la classe qui est:?>) – willium

Questions connexes