簡體   English   中英

這是在PHP中使用類的正確方法嗎?

[英]Is this a proper way to use a class in PHP?

class MyImageTestClass{  
    var $url = "nfl2.jpg";  
    var $ID = "one";  

    function __construct() {  

    }  

    function setUrl($value){  
        $this->url = $value;  
    }  

    function setID($newid){  
        $this->ID = $newid ;  
    }  

    function loadImg($value,$newid){  
        $this->setID($newid);  
        $this->setUrl($value);  
        print "<img id=\"$this->ID\" src=\"$this->url\"/>";  
    }  
}  

$n = new MyImageTestClass();  

$n->loadImg("peterson.jpg","two");  

還是應該將setID()和setURL保留在loadImg函數之外,然后編寫,

$n->setID();  
$n->setUrl();  
$n->loadImg();  

我將使用“私有”或“受保護”或“公共”而不是“ var”。 另外,在將屬性聲明為私有等之后,我將在構造函數方法中設置默認值。

就個人而言,這就是我的做法,但是自從我完成PHP以來已經一兩年了。

class ImageBuilder{  
    private $url;    
    private $ID;    

    function __construct($url, $ID) {  
        $this->setUrl($url); 
        $this->setID($ID);   
    }  

    function setUrl($url){  
        if($url == NULL){
            $this->url = "nfl2.jpg";
        }else{
            $url = htmlentities($url, ENT_QUOTES);
            $this->url = $url;
        }
    }  

    function setID($ID){  
        if($ID == NULL){  
            $this->ID = "one";  
        }else{
            $this->ID = $ID;  
        }   
    }  

    function setImg($url, $ID){  
        $this->setUrl($url);
        $this->setIId($ID);
    }   

    function printImg(){  
        print "<img id=\"{$this->ID}\" src=\"{$this->url}\"/>";  
    }  
}  

$n = new ImageBuilder("peterson.jpg", "two");  

$n->printImg();

另外,如果要在數據庫循環中使用:

//pretend this is coming out of your DB
$db_img = array(array("url" => "url.png", "id" => "1"), array("url" => "blah.gif", "id" => "2"));

$image = new ImageBuilder();

foreach($db_img as $img){
    $image->setImg($img["url"], $img["id"]);
    $image->printImg();        
} 

您可以選擇任何一種方式。 最主要的是,所有函數都保留在類本身內。 因此,使用任何方式都沒有問題。

但是從您的代碼來看,我懷疑您只需要一個功能:

function loadImg($value,$newid){
      print "<img id=\"$newid\" src=\"$value\"/>";
}

無需其他功能。

  1. 根據經驗,絕對不要將HTML嵌入可執行代碼中。 使用模板系統可能會更好。
  2. 如果要顯式聲明getter / setter方法,則使相應的屬性受到保護是有意義的。 否則,沒有什么可以阻止您或其他任何人跳過方法並直接讀取/寫入屬性。
  3. 如果傳遞給setUrl()的值包含未過濾的輸入怎么辦? 呈現的每個動態值都應提供給htmlentities()等。 想像:

    setUrl(' http://somesite.org/dir/?param1= <腳本>警報(“ I CAN HAS HACK”); </ script>“));

我的意思是,您應該使用模板系統,以便將輸出數據的准備與可視化分開。

$data = $myLibrary->getSomeData($arguments);
$t = new SomeTemplatingEngine;
$t->setData($data);
$t->setTemplate('someTemplate.html');
return $t->renderToHtml();

相對於:

$r = mysql_query(...)
while ($row = mysql_fetch_assoc($r))
{
  print "<tr>";
  print "<td>";
  print $row['someField'];
  ...
}

我最喜歡的模板引擎是Dwoo ,嘗試一下。

在這種特殊情況下,您有一個不可變對象 ,這意味着您可以刪除設置器並使用以下版本:

class MyImageTestClass{  
    private $_url;  
    private $_id;  

    function __construct($id, $url) {  
        $this->_id = $id;
        $this->_url = $url;
    }  

    function loadImg(){  
        return "<img id=\"" . $this->_id . "\" src=\"" . $this->_url . "\"/>";  
    }  
}  

$n = new MyImageTestClass("foo", "bar.jpg");  

echo $n->loadImg();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM