Конкатенация строк и функция класса в PHP? - PullRequest
0 голосов
/ 10 ноября 2010

Я писал простой класс. Вот код:

class Book{
    var $title;
    var $publishedDate;

    function Book($title, $publishedDate){
        $this->title = $title;
        $this->publishedDate = $publishedDate;
    }

    function displayBook(){
        echo "Title: " . $this->title . " published on " . $this->publishedDate . "";
    }

    function setAndDisplay($newTitle, $newDate){
        $this->title = $newTitle;
        $this->publishedDate = $newDate;
        echo "The new information is of the book <b>" . $this->displayBook() . "</b><br />";
    }
}

И я инициализировал класс и вызвал функцию:

$test = new Book("Harry Potter", "2010-1-10");
$test->setAndDisplay("PHP For Beginners", "2010-2-10");

И результат:

"Title: PHP For Beginners published on 2010-2-10The new information is of the book"

Не должно ли быть:

"The new information is of the book **Title: PHP For Beginners published on 2010-2-10**

Может кто-нибудь объяснить?

Ответы [ 2 ]

3 голосов
/ 10 ноября 2010

Метод displayBook() не возвращает строку (или что-либо в этом роде), поэтому вам не следует использовать результат в конкатенации.

То, что происходит, это вызов displayBook() в echo в setAndDisplay() происходит до echo завершения.

Вы должны использовать разные методы для прямого вывода по сравнению с генерацией строки, например

public function getBook()
{
    return sprintf('Title: %s published on %s',
                   $this->title,
                   $this->publishedDate);
}

public function displayBook()
{
    echo $this->getBook();
}

public function setAndDisplay($newTitle, $newDate)
{
    $this->title = $newTitle;
    $this->publishedDate = $newDate;
    echo "The new information is of the book <b>", $this->getBook(), "</b><br />";
}

Редактировать: Я бы серьезно переоценил необходимость для вашего класса напрямую echo данных. Это редко хорошая идея.

Edit2: передача параметров в echo быстрее, чем объединение

1 голос
/ 10 ноября 2010

Это потому, что displayBook() повторяет строку.И когда вы пытаетесь добавить или внедрить функцию, которая что-то повторяет, она будет помещена в начале.Вы должны заменить точки . запятыми ,, чтобы они были размещены в нужном месте.

http://codepad.org/9pfqiRHu

...