这是在PHP中使用类的正确方法吗?

时间:2009-12-31 14:14:33

标签: php oop

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

5 个答案:

答案 0 :(得分:3)

我会使用“私人”或“受保护”或“公共”代替“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();        
} 

答案 1 :(得分:2)

你可以选择任何一种方式;最重要的是你所有的功能都留在了班级本身。所以你选择的方式没有任何问题。

但是从您的代码中,我怀疑您只需要一个功能:

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

无需其他功能。

答案 2 :(得分:2)

  1. 根据经验,您不应该在可执行代码中嵌入HTML。使用模板系统可能会更好。
  2. 如果要显式声明getter / setter方法,则使相应的属性受到保护是有意义的。否则,没有什么可以阻止你或其他任何人跳过这些方法并直接读/写属性。
  3. 如果传递给setUrl()的值包含未经过类型化的输入,该怎么办?渲染的每个动态值都应该输入到htmlentities()等。想象一下:

    setUrl('http://somesite.org/dir/?param1=<script&gt;提醒(“我已经很高兴”);&lt; / script&gt;“);

答案 3 :(得分:2)

我的意思是你应该使用模板系统,以便将输出数据的准备与其可视化分开。

$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,试试吧。

答案 4 :(得分:1)

在这种特殊情况下,您有一个Immutable object,这意味着您可以删除setter并使用以下版本:

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