我正在尝试将OOP原则与我正在开发的Web应用程序结合起来。
给定一个类ImageData定义为
class ImageData {
private $count;
private $dirArray;
public function __construct() {
$count = 0;
$dir = "panos/thumbs";
$dirCon = opendir($dir);
while ($name = readdir($dirCon)){
if (strtolower(substr($name, -3)) == "jpg"){
$dirArray[]= $name;
}
}
sort($dirArray);
$count= count($dirArray);
closedir($dirCon);
}
public function getCount(){
return $this->count;
}
public function getArray(){
return $this->dirArray;
}
}
我想使用此处的信息来渲染网页。在指定的div元素中,我有
$imageData = new ImageData();
$count = $imageData->getCount();
$data = $imageData->getArray();
但是,$count
和$data
未在本地实例化,并且包含的信息无法在呈现代码中使用。我已经介绍了xdebug中的代码,构造函数将期望值分配给$count
和$data
。在Java和C中,变量不需要在声明时进行实例化。对PHP来说这是真的吗?
答案 0 :(得分:4)
在您的构造函数中,您必须使用$this->count
代替$count
,$dirArray
使用{{1}}。
PS:你可以在PHP类中只像你那样声明你的变量。
答案 1 :(得分:1)
免责声明: 因为问题显然已经得到解答,这是对提供的代码的长格式评论。 子>
编写类时,应尽量避免在构造函数中进行计算。这使得难以调试代码。
我实际上会像这样构造代码:
class ImageData {
protected $count = 0;
protected $dir = null;
protected $dirArray = null;
public function __construct( $dir = 'panos/thumbs') {
$this->dir = $dir;
}
public function getCount(){
if ( is_array($this->dirArray) ){
$this->initialize();
}
return $this->count;
}
public function getArray(){
if ( is_array($this->dirArray) ){
$this->initialize();
}
return $this->dirArray;
}
protected function initialize(){
$this->dirArray = $this->findImages();
sort($this->dirArray);
$this->count = count($dirArray);
}
protected function findImages( $extensions = array('jpg') ){
$files = array();
$dirCon = opendir($this->dir);
while ($name = readdir($dirCon)){
$current = strtolower(substr($foo, strrpos($foo, '.')+1));
if ( in_array( $current, $extensions ) ){
$files[] = $name;
}
}
closedir($dirCon);
return $files
}
}
首先,如果您现在不需要protected
,我建议您使用private
而不是private
。因为类的private
成员不是“可见的”,所以当你扩展类时。
另一件事是将对象的初始化移动到实际需要的位置。通过稍作修改,此类可以让您重复搜索文件夹,甚至可以在不同的文件夹中搜索。
如果您想学习如何在PHP环境中使用OOP,请先阅读http://php.net/manual/en/language.oop5.php。你可能会发现PHP Object-Oriented Solutions本书对你有很大的帮助。