我开始研究PHP面向对象编程 我对PHP的经验有限。
我有如下PHP代码:
A"汽车"类:
class Cars {
static $car_specs = array("wheel_count", "name", "color");
static function set_car_detail() {
self::$car_specs["wheel_count"] = 4;
self::$car_specs["name"] = "default";
self::$car_specs["color"] = "generic";
}
static function get_car_detail() {
return self::$car_specs;
}
}
然后我想输出这个:
Cars::set_car_detail();
echo implode(',', Cars::get_car_detail());
回声是:
wheel_count,name,color,4,default,generic
但是我想要得到:
4,default,generic
forep尝试产生了类似的反应。
我希望了解我做错了什么。
答案 0 :(得分:2)
您已使用值初始化数组,但您可能希望使用键初始化它:
static $car_specs = array(
"wheel_count" => null,
"name" => null,
"color" => null
);
答案 1 :(得分:1)
由于您已经拥有key
个值的数组,为什么不为每个密钥创建相应的values
数组并使用array_combine()
。
class Cars {
static $car_specs;
static function set_car_detail() {
$keys = array("wheel_count", "name", "color");
$values = array(4, "default", "generic");
self::$car_specs = array_combine($keys, $values);
}
static function get_car_detail() {
return self::$car_specs;
}
}
Cars::set_car_detail();
echo implode(',', Cars::get_car_detail());
答案 2 :(得分:1)
您发布的代码根本不是一个类。它只是一堆具有时髦名称的全局函数和变量。尽量避免使用静态属性和方法,因为它们不是OOP。还要尽量避免使用公共属性和getter / setter,因为它们只是伪装的程序编程。
Car
类的骨架可能如下所示:
class Car {
private $wheel_count;
private $name;
private $color;
public function __construct($wheel_count, $name, $color)
{
$this->wheel_count = $wheel_count;
$this->name = $name;
$this->color = $color;
}
public function paint($new_color)
{
$this->color = $new_color;
}
public function describe()
{
return sprintf('%d wheels, %s %s', $this->wheel_count, $this->color, $this->name);
}
}
对象属性是私有的。封装是OOP的关键概念之一。它们在构造函数中设置。构造函数的作用是初始化对象,使其准备好工作。确保构造函数初始化所有对象的属性,并且它不执行任何其他操作(在构造函数中没有工作。)
在类中创建对您的类有意义的操作的方法。例如,汽车的车轮数量永远不会改变,没有必要编写一种方法来设置不同数量的车轮。但是汽车的颜色有时会改变,而paint()
方法会处理它。
避免编写“getters”(即除了返回属性值之外什么都不做的方法)。它们表明某些属于该类的代码是在类之外的某个地方编写的(很多时候它在这里和那里都是重复的,只有很少或没有变化)。只要可能和适当,编写一个使用对象属性生成有用值的方法(而不是编写getter以便在其他地方计算有用值)。
这是使用下面描述的Car
类的方法:
$car1 = new Car(4, 'Mazda', 'red');
$car2 = new Car(8, 'big truck', 'blue');
echo($car1->describe());
# 4 wheels, red Mazda
$car1->paint('green');
echo($car1->describe());
# 4 wheels, green Mazda
答案 3 :(得分:0)
具有专门针对该
的不言自明的功能 static function get_car_detail() {
return array_values(self::$car_specs);
}