仅PHP数组返回值

仅PHP数组返回值,php,arrays,oop,Php,Arrays,Oop,我已经开始学习PHP面向对象编程。 一般来说,我对PHP的经验有限 我有如下PHP代码: “汽车”类: 然后我尝试输出以下内容: Cars::set_car_detail(); echo implode(',', Cars::get_car_detail()); 回声是: wheel_count,name,color,4,default,generic 然而,我试图得到: 4,default,generic foreach的尝试产生了类似的反应。 我想知道我做错了什么。有一个自解释功能专门

我已经开始学习PHP面向对象编程。
一般来说,我对PHP的经验有限

我有如下PHP代码:

“汽车”类:

然后我尝试输出以下内容:

Cars::set_car_detail();
echo implode(',', Cars::get_car_detail());
回声是:

wheel_count,name,color,4,default,generic
然而,我试图得到:

4,default,generic
foreach的尝试产生了类似的反应。
我想知道我做错了什么。

有一个自解释功能专门用于此

   static function get_car_detail() {
      return array_values(self::$car_specs);
   }

有一个自解释的函数专门用于此

   static function get_car_detail() {
      return array_values(self::$car_specs);
   }

您已经用值初始化了数组,但可能要用键初始化它:

static $car_specs = array(
    "wheel_count" => null, 
    "name" => null, 
    "color" => null
);

您已经用值初始化了数组,但可能要用键初始化它:

static $car_specs = array(
    "wheel_count" => null, 
    "name" => null, 
    "color" => null
);

既然您已经有了一个
键的数组
值,为什么不为每个键创建一个相应的
值数组
,并使用
数组\u combine()


既然您已经有了一个
键的数组
值,为什么不为每个键创建一个相应的
值数组
,并使用
数组\u combine()


您发布的代码根本不是类。它只是一堆具有时髦名称的全局函数和变量。尽量避免使用静态属性和方法,因为它们不是OOP。还要尽量避免使用公共属性和getter/setter,因为它们只是伪装的过程编程

汽车
类的骨架可以如下所示:

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()
方法可以处理这种情况

避免编写“getter”(即只返回属性值的方法)。它们是属于类的某些代码在类之外的某个地方编写的标志(很多时候,它在这里、那里和任何地方都被复制,只做了很小的更改或没有更改)。只要可能且合适,编写一个使用对象属性生成有用值的方法(而不是编写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

您发布的代码根本不是类。它只是一堆具有时髦名称的全局函数和变量。尽量避免使用静态属性和方法,因为它们不是OOP。还要尽量避免使用公共属性和getter/setter,因为它们只是伪装的过程编程

汽车
类的骨架可以如下所示:

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()
方法可以处理这种情况

避免编写“getter”(即只返回属性值的方法)。它们是属于类的某些代码在类之外的某个地方编写的标志(很多时候,它在这里、那里和任何地方都被复制,只做了很小的更改或没有更改)。只要可能且合适,编写一个使用对象属性生成有用值的方法(而不是编写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

这不是OOP-您应该使用getter/setter,而不是将每个属性放入1个数组+也不需要static。为什么要在单独的函数中设置细节?将来,您是否计划传递这些值?否则,为什么不创建已经水合的数组就没有意义了。
Cars
“class”根本不是class。它更像一个名称空间。避免使用静态成员和方法。它们是具有奇特名称的全局对象。这不是OOP-您应该使用getter/setter,而不是将每个属性放入1个数组+也不需要static。为什么要在单独的函数中设置细节?将来,您是否计划传递这些值?否则,为什么不创建已经水合的数组就没有意义了。
Cars
“class”根本不是class。它更像一个名称空间。避免使用静态成员和方法。它们是具有奇特名称的全局对象。
内爆
已经只对数组值进行操作,这不是这里的问题。
内爆
已经只对数组值进行操作,这不是这里的问题。谢谢。您的答复提供了大量信息。我同意提供的类不是一个真正的类……当时我的重点是静态变量和函数如何工作。静态属性只是具有复杂名称(和可见性约束)的全局变量。他们不是继承的;您可以使用
self:$car\u specs
从扩展
Cars
的类访问静态变量(
Cars::$car\u specs
),但是,除非您(重新)在子类中声明属性,否则子类中的
self:$car\u specs
Cars:$car\u spe>是一样的