Почему я не могу ничего напечатать с помощью __toString() в PHP?

Я создал класс с конструктором и методом toString, но он не работает.

class Course
{
    protected $course
    public function __construct()
    {
        $this->$course = "hello";
    }

    public function __toString()
    {
        $string = (string) $this->$course;
        return $string;
    }
}

Я получаю сообщение об ошибке:

Fatal error: Cannot access empty property 

если я просто сделаю:

$string = (string) $course;

Ничего не распечатывает.

Я новичок в магических методах в PHP, хотя я знаком с методом toString в Java.


person Johnathan Au    schedule 28.03.2012    source источник
comment
Я думаю, вы имели в виду, что заголовок читать нельзя.   -  person Matt Ball    schedule 29.03.2012


Ответы (2)


в вашем конструкторе есть небольшая опечатка, она должна быть:

protected $course;
public function __construct()
{
    $this->course = "hello"; // I added $this->
}

если вы сейчас вызовете свою функцию __toString(), она напечатает «привет».

Обновить
Вы должны изменить функцию __toString() следующим образом:

public function __toString()
{
    return $this->course;
}

Ваш общий код станет таким: (скопируйте и вставьте :))

class Course
{
    protected $course;
    public function __construct()
    {
        $this->course = "hello";
    }

    public function __toString()
    {
        return $this->course;
    }
}
person Bazzz    schedule 28.03.2012
comment
Я получаю ту же фатальную ошибку: Не удается получить доступ к пустой ошибке свойства, но теперь она ссылается на строку в конструкторе. - person Johnathan Au; 29.03.2012
comment
$this->$course в методе _toString будет работать только в том случае, если в этом методе есть локальная переменная $course, поэтому код все еще не работает. Но +1 за обнаружение ошибки конструктора. Между вами и Халтабушем вы решили проблему. - person Marc B; 29.03.2012
comment
@MarcB добавил предложенный __ToString(), чтобы сделать мой ответ полным. - person Bazzz; 29.03.2012

Вы хорошо поняли магический метод, но здесь у вас ошибка: $course не определен.

Ваша ошибка в этой строке:

    $string = (string) $this-> $course;

Так должно быть

    $string = (string) $this->course;

Возможно, вы знаете, что в PHP вы можете сделать что-то вроде этого:

$course='arandomproperty';
$string = $this->$course; //that equals to $this->arandomproperty

Здесь $course не определен, поэтому по умолчанию он равен '' (и выдает ошибку NOTICE, которую вы должны отображать или регистрировать, по крайней мере, во время разработки)


Изменить:
У вас также есть ошибка в вашем конструкторе, вы должны сделать $this->course='hello';


редактировать 2

Вот рабочий код. Вам здесь что-то не понятно?

<?php
class Course
{
    protected $course;
    public function __construct()
    {
        $this->course = "hello";
    }

    public function __toString()
    {
        $string = (string) $this->course;
        return $string;
    }
}
$course = new Course();
echo $course;
person haltabush    schedule 28.03.2012
comment
Я пробовал все предложения, но это все еще не работает :( Я действительно не понимаю. - person Johnathan Au; 29.03.2012
comment
Избавьтесь от $this->$course и замените его на $this->course - person haltabush; 29.03.2012
comment
когда вы говорите, что ничего не распечатывается, возможно, вы не используете печать или эхо? Попробуйте echo (string)$course; - person Paul Dixon; 29.03.2012
comment
О, теперь я вижу. Я добавил знак доллара! - person Johnathan Au; 29.03.2012
comment
Как я упоминал в своем первоначальном посте, вы должны отображать или регистрировать (если вы смотрите журналы: p) все ошибки PHP, это поможет вам во время отладки :) - person haltabush; 29.03.2012