PHP: OOP konular

8 Cevap php

PHP ile OOP için oldukça yeni.

Tamam her şeyden önce bu bir hata üretir:

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

ama bu değil:

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

Ben niye anlamıyorum?

Ayrıca yöntem getBody () .. Burada bunun bir pasajı ya şey .. ama hiçbir hata dönen değil:

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
}

Herkes neden biliyor mu?

Teşekkürler!

Edit: Siz dereferencing PHP çalışmıyor olduğunu açıklayan iyi bir iş yapmış. Ama hala getBody () bir dize döndüren değil neden bulmaktan yardıma ihtiyacım var. Ben php çıkmayı ediyorum çünkü o yüzden teklif yok mi? Hiçbir şey geçmek bile hala doğru html dize döndürmek gerekir? Neden öyle değil mi?

Teşekkürler!

8 Cevap

Başkaları ne sen "doğrudan yöntemleri dönüş değerlerini inceleyebilirsiniz olamaz" çok doğru olmadığını söyledi. Aslında 'sadece' yeni yapmak için çalışıyoruz ne bir sınıfın, örneklerini oluşturulmuş olamaz doğrudan inceleyebilirsiniz. Ama bu böyle somthing yapmak elbette mümkündür:

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

Yani doğrudan yeni oluşturulan nesnenin bir şey yapamaz, ancak yöntemler dönüş değerleri ile bir şeyler yapabiliriz.

Eğer PHP bloğunun dışında tanımlanmış bir HTML blok döndürmek için çalışıyoruz çünkü getBody şey geri gelmez diğer sorundur. PHP sadece arasında yazdığı her şeyi alır düşünebilir?> ve

HTML bir dize döndürmek için, bu gibi normal dize sınırlayıcı kullanabilirsiniz:

function getBody() {
    return
    '<p style="color: red;">Hello</p>
    <p>World</p>';
}

Ben niye anlamıyorum?

PHP sözdizimi keyfi diyor çünkü böylece: yöntemlerinden olabildiğince doğrudan değil KQUEUE (bir nesne veya bir dizi olarak ya) dönüş değerleri. Önce değişkenlere atamak gerekir.

Threre gerçekten bu davranışın arkasında hiçbir anlamlı semantik açıklama. Bildiğim kadarıyla, bu PHP'nin sonraki sürümü de değiştirmek ayrıca tabidir.

İlk soruya gelince, diğer posterler doğru. PHP doğrudan dönüş değerlerini inceleyebilirsiniz izin vermez.

Saniye olarak, getBody () yöntemi (bir mantık hatası dışında) bir hata olmadığı, boş dönecektir. Sürece addBody () boş bir parametre kabul eder gibi, kod çalışacaktır.

Bir yan not ve aklı bir mesele olarak, bir noktalı virgül ile GetBody olarak getirisi () bitmeli. Eğer buradan dışarı bırakırsanız o kafa karıştırıcı olabilir bir satırın sonunda noktalı virgül gerekir ve kod değiştirilmiş ise gelecekte hatalara neden yok PHP gibi birkaç durum vardır. Hala çalışıyor nedeni return ifadesi bloktaki son şey olmasıdır.

Yerine onu yankılanan html dönmek için, bunu bir dize olması gerekir:

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

PHP anında de-başvuru izin vermez. Bunu da yapamam:

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

Hakkında vücut olsun, ben bir dönüş php dışında şeyler döner görmemiştim. Ama bu iyi php tuhaflıklar biri olabilir. Ama bu çalışması gerekir:

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

}

Herkes neden olamaz açıkladığı gibi, ben o kısmını atlamak olacak. Ama bunu yapabilirsiniz:

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

olabilir,

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

i think. çalışması gerektiğini, bunu deneyin.

Ayrıca, getBody fonksiyon şey dönen değil, ve, her şey döndükten sonra idam değildir. (Bu değişmedikçe)

Eğer bu konuda bir dize döndürmek istiyorsanız i (obstArt kullanarak salık) ve 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();
}

Php 5.4 yana

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

geçerli sözdizimi.