2008-09-10 2 views
55

Итак, я реорганизую свой код, чтобы реализовать больше ООП. Я создал класс для хранения атрибутов страницы.Вызов функции-члена на не-объекте

class PageAtrributes 
{ 
    private $db_connection; 
    private $page_title; 

    public function __construct($db_connection) 
    { 
     $this->db_connection = $db_connection; 
     $this->page_title = ''; 
    } 

    public function get_page_title() 
    { 
     return $this->page_title; 
    } 

    public function set_page_title($page_title) 
    { 
     $this->page_title = $page_title; 
    } 
} 

Позже я вызываю функцию set_page_title() как так

function page_properties($objPortal) {  
    $objPage->set_page_title($myrow['title']); 
} 

Когда я получаю сообщение об ошибке:

Call to a member function set_page_title() on a non-object

Так что мне не хватает?

+3

Это objPage не относятся к экземпляру PageAtrributes объекта (или на самом деле, любой объект). Попробуйте var_dump в предыдущей строке, чтобы узнать, что это на самом деле. – 2008-09-10 16:20:57

+0

во-первых, создайте экземпляр класса, во-вторых, определите его как: $ new_instance = new Class(); затем направьте его на свой метод: $ new_instance-> set_page_title ('MyNewTitle'); – 2013-06-03 14:00:59

ответ

37

Это означает, что $objPage не является экземпляром объекта. Можем ли мы увидеть код, который вы использовали для инициализации переменной?

Как вы ожидаете конкретный тип объекта, вы можете также использовать PHPs type-hinting featureDocs, чтобы получить ошибку, когда ваша логика нарушается:

function page_properties(PageAtrributes $objPortal) {  
    ... 
    $objPage->set_page_title($myrow['title']); 
} 

Эта функция будет принимать только PageAtrributes для первого параметра.

-1

я понял, что я не проходил $ objPage в page_properties(). Теперь он отлично работает.

1

Рекомендую принять принятый ответ выше. Однако, если вы находитесь в затруднительном положении, вы можете объявить объект глобальным в функции page_properties.

$objPage = new PageAtrributes; 

function page_properties() { 
    global $objPage; 
    $objPage->set_page_title($myrow['title']); 
} 
+0

Я просто знал это сегодня ... OMG. очень отличается от java. – gumuruh 2012-03-19 10:13:30

0

вы можете использовать 'использовать' в функции как сильфона например

function page_properties($objPortal) use($objPage){  
    $objPage->set_page_title($myrow['title']); 
} 
34

Там простой способ, чтобы произвести эту ошибку:

$joe = null; 
    $joe->anything(); 

Отрендерит ошибку:

Fatal error: Call to a member function anything() on a non-object in /Applications/XAMPP/xamppfiles/htdocs/casMail/dao/server.php on line 23

Было бы намного лучше, если бы PHP просто сказал бы,

Fatal error: Call from Joe is not defined because (a) joe is null or (b) joe does not define anything() in on line <##>.

Обычно вы должны построить свой собственный класс $joe не определен в конструкторе или

6

Либо $objPage не является переменным экземпляром или ваш перезаписывает $objPage с чем-то не экземпляр класса PageAttributes.

4

Это также может означать, что при инициализации объекта вы можете повторно использовать имя объекта в другой части вашего кода. Поэтому изменение его аспекта от объекта к стандартной переменной.

IE

$game = new game; 

$game->doGameStuff($gameReturn); 

foreach($gameArray as $game) 
{ 
    $game['STUFF']; // No longer an object and is now a standard variable pointer for $game. 
} 



$game->doGameStuff($gameReturn); // Wont work because $game is declared as a standard variable. You need to be careful when using common variable names and were they are declared in your code. 
1
function page_properties($objPortal) {  
    $objPage->set_page_title($myrow['title']); 
} 

выглядит как различные имена переменных $ objPortal против $ objPage