PHP: ООП проблемы - PullRequest
       6

PHP: ООП проблемы

1 голос
/ 16 июня 2009

Я довольно новичок в ООП с PHP.

ОК, в первую очередь это выдает ошибку:

$mail->addBody(new MailWishListInquiry()->getBody(348));

но это не так:

$wishListInquiry = new MailWishListInquiry();
$mail->addBody($wishListInquiry->getBody(348));

Не понимаю почему?

Кроме того, метод getBody () ничего не возвращает .. но и ошибки нет ... есть фрагмент:

function getBody($pid)
{

    $qry = 'SELECT * FROM cart_product WHERE product_id = '.$pid;
    $result = mysql_query($qry);
    $row = mysql_fetch_assoc($result);

    $item_name = $row['product_name'];
    $item_url = 'product.php?pid='.$pid;
    $item_image_url = 'product_images/'.$pid.'_sm_'.$row['product_image_sm'];

    return
    ?>
    <div style="width:600px; font-family:Arial, Helvetica, sans-serif; color:#333333;">

        ...

    </div>
    <?php
}

Кто-нибудь знает почему?

Спасибо !!

Редактировать: Вы, ребята, хорошо поработали, объяснив, что разыменование не работает в PHP. Но мне все еще нужна помощь в выяснении, почему getBody () не возвращает строку. Это потому, что я вырываюсь из php, поэтому мне не нужно его цитировать? Даже если я ничего не передам, он все равно должен вернуть строку html, верно? Почему это не так?

Спасибо!

Ответы [ 8 ]

11 голосов
/ 17 июня 2009

Я не понимаю, почему?

Поскольку синтаксис PHP произвольно говорит так: вы не можете напрямую разыменовывать (как объект или как массив) возвращаемые значения из методов. Сначала нужно назначить их переменным.

На самом деле за этим поведением нет значимого семантического объяснения. Насколько я знаю, это может быть изменено в будущей версии PHP.

8 голосов
/ 17 июня 2009

То, что другие говорили, что вы "не можете напрямую разыменовать возвращаемые значения из методов", не совсем правильно. Вы на самом деле «просто» не можете напрямую разыменовывать вновь созданные экземпляры класса, что вы и пытаетесь сделать. Но, конечно, можно сделать что-то вроде этого:

class Test {

public function a() {
    echo "a";
    return $this;
}

public function b() {
    echo "b";
    return $this;
}

public function c() {
    echo "c";
    return $this;
}

}

$test = new Test();

$test->a()->b()->c();

Таким образом, вы не можете напрямую что-то сделать с вновь созданным объектом, но вы можете сделать что-то с возвращаемыми значениями методов.

Другая ваша проблема в том, что getBody ничего не возвращает, заключается в том, что вы пытаетесь вернуть блок HTML, определенный вне блока PHP. Вы можете подумать, что PHP просто берет все, что вы написали между тегами?> И <? Php, и возвращает его в виде строки. Но вместо этого он просто запишет его в стандартный вывод (обычно в ваш браузер) и вернет метод без значения (void). </p>

Чтобы вернуть строку HTML, вы можете использовать обычные разделители строк, например:

function getBody() {
    return
    '<p style="color: red;">Hello</p>
    <p>World</p>';
}
4 голосов
/ 17 июня 2009

Что касается первого вопроса, остальные постеры верны. PHP не позволяет напрямую разыменовывать возвращаемые значения.

Что касается второго, ваш метод getBody () вернет значение null, что не является ошибкой (кроме логической ошибки). Пока addBody () будет принимать нулевой параметр, ваш код будет работать.

В качестве примечания и здравого смысла вы должны завершить возвращение в getBody () точкой с запятой. В PHP так мало случаев, когда вам не нужна точка с запятой в конце строки, что может привести к путанице, если вы оставите это здесь, и вызвать ошибки в будущем, если код будет изменен. Причина, по которой он все еще работает, заключается в том, что оператор return является последним в блоке.

Чтобы возвратить html вместо его повторения, вам нужно, чтобы он был строкой:

return '<div style="width:600px; font-family:Arial, Helvetica, sans-serif; color:#333333;">';
1 голос
/ 17 марта 2012

С php 5.4

(new Something())->someMethod();

- допустимый синтаксис.

1 голос
/ 17 июня 2009

Если вы хотите вернуть строку в этом отношении, я рекомендую использовать obstart () и ob_get_contents

function getBody($pid)
{

    $qry = 'SELECT * FROM cart_product WHERE product_id = '.$pid;
    $result = mysql_query($qry);
    $row = mysql_fetch_assoc($result);

    $item_name = $row['product_name'];
    $item_url = 'product.php?pid='.$pid;
    $item_image_url = 'product_images/'.$pid.'_sm_'.$row['product_image_sm'];

    ob_start();
    ?>
    <div style="width:600px; font-family:Arial, Helvetica, sans-serif; color:#333333;">

        ...

    </div>
    <?php
    return ob_get_contents();
}
1 голос
/ 17 июня 2009

Что касается get body, я никогда не видел, чтобы return возвращал вещи вне php. Но это вполне может быть одним из причуд PHP. Но это должно работать:

<?php

function getBody($pid)
{

    $qry = 'SELECT * FROM cart_product WHERE product_id = '.$pid;
    $result = mysql_query($qry);
    $row = mysql_fetch_assoc($result);

    $item_name = $row['product_name'];
    $item_url = 'product.php?pid='.$pid;
    $item_image_url = 'product_images/'.$pid.'_sm_'.$row['product_image_sm'];

    return '<div style="width:600px; font-family:Arial, Helvetica, sans-serif; color:#333333;"></div>';

}

1 голос
/ 17 июня 2009

Как все объяснили, почему нельзя, я пропущу эту часть. Но вы можете сделать это:

$mail->addBody(new MailWishListInquiry()->getBody(348));

может быть

$mail->addBody( MailWishListInquiry::getBody(348));

Я думаю. Попробуйте, должно работать.

Кроме того, ваша функция getBody ничего не возвращает, и все после возврата не выполняется. (если это не изменилось)

1 голос
/ 17 июня 2009

PHP не позволяет мгновенную разыменование. Вы также не можете сделать это:

(new Something())->someMethod();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...