数组或类是否应该用于在PHP中保存多个变量?

时间:2012-06-05 19:20:10

标签: php arrays class

目前,我正在创建一个脚本,用于解析传递给它的特定类型报告中的信息。脚本的一部分将从报告中提取学生信息并保存以供以后处理。

最好是以类的形式或数组变量来保存它吗?我认为我可以使用3种方法。

编辑:真的,问题归结为任何一种方式都有任何性能优势吗?因为否则,每种方法都与最后一种方法完全相同。

作为可直接访问变量的类:

class StudentInformation {

    public $studentID;
    public $firstName;
    public $lastName;
    public $middleName;
    public $programYear;
    public $timeGenerated;

    function StudentInformation(){} 
}

作为具有功能的类:

class StudentInformation {

    private $studentID;
    private $firstName;
    private $lastName;
    private $middleName;
    private $programYear;
    private $timeGenerated;

    function StudentInformation(){}

    public function setStudentID($id)
    {
        $this->studentID = $id;
    }

    public function getStudentID()
    {
        return $this->studentID;
    }

    public function setFirstName($fn)
    {
        $this->firstName = $fn;
    }

    /* etc, etc, etc */
}

或者作为一个以字符串作为键的数组:

$studentInfo = array();
$studentInfo["idnumber"] = $whatever;
$studentInfo["firstname"] = $whatever;
$studentInfo["lastname"] = $whatever;
/* etc, etc, etc */

7 个答案:

答案 0 :(得分:3)

您可以为单个学生创建一个课程,为单个学生提供适当的操作,例如更新成绩或获取全名(具有访问功能的私有数据成员)。然后为包含一系列单个学生的多个学生创建另一个班级。您可以创建对学生组进行操作的功能,根据需要测试和调用各个学生功能。

高级答案是您可以按照您的建议任何方式执行此操作,但我们大多数人都会推荐OOP解决方案。如果您的需求非常简单,那么简单的数组就足够了。如果您的需求发生变化,您可能不得不为对象重新编码整个事物。类也可以保持简单,所以我建议你从类开始并根据需要增加复杂性。我相信从长远来看,它会更好地维持和扩展,并且可以通过课程来构建。

答案 1 :(得分:3)

  1. 尝试优化数组与简单值对象的使用可能是不必要的微优化。对于最简单的情况,数组更快,因为您没有构造new对象的开销。

  2. 重要的是要记住这一点:数组不是唯一存在的数据结构。如果您不需要哈希功能,简单的SplFixedArraydocs将导致较低一旦超过对象创建的初始开销,就会产生内存开销和更快的迭代。如果您要存储大量数据,则上述固定数组或其他SPL data structures之一可能是更好的选择。

  3. 最后:值对象应该是不可变的,所以在你的情况下,我强烈建议一个对象提供的封装,而不是无情地分配哈希映射值的能力。如果您希望使用数组表示法的简单性,请让您的类实现ArrayAccessdocs并充分利用这两个世界。有人会建议使用__get__set的魔法吸气剂和制定者。我不会,因为魔术通常会不必要地混淆你的代码。如果你真的需要魔法,你可能会重新考虑你的设计。

  4. 有一个原因可以解释为什么OOP范式被认为是我们提出的最佳编程范例 - 因为它是我们提出的最佳范例。你应该使用它。避免陷入许多/大多数使用数组的PHP开发者的陷阱。

答案 2 :(得分:1)

关于性能问题,类可能比数组更快,因为不同的实例是独立存储的。通过将所有内容放在一个巨型哈希映射(关联数组)中,您还可以获得数组的一些限制/属性。例如,订购。你不需要那个。此外,如果PHP解释器不是智能的,它会在每次查找时散列您的查找字符串。使用不必要的类和静态类型。

答案 3 :(得分:1)

3个选项有效,但与外界有不同程度的封装/保护。

从最低保护到最高保护:

  1. 阵列
  2. 可直接访问公共属性的对象
  3. 具有getter / setters的对象
  4. 选择在很大程度上取决于项目的环境(2小时?明天发送到垃圾箱?)

    选择2似乎很务实。

    考虑到根据您的数据库包装器,数据可以被提取到数组或对象中。如果将其作为数组提取,则可能必须将它们映射到对象。

答案 4 :(得分:0)

这是一个没有确定答案的主观问题,但我会推荐OOP方式。您可以创建一个包含Parser实例的类StudentInformation

它更舒适,如果您需要一些额外的处理,可以添加更多方法。

答案 5 :(得分:0)

如果你只编写一个没有很多功能的小项目,那么阵列会更好。但是,课程有其优点。例如,您更愿意输入

$class->db_update("string", $database);

$query = "SELECT * FROM `table` WHERE foo='".$array['bar'].'";
mysql_connect("...
mysql_query($query...

基本上,每一方都有其优势。我推荐OOP方式,因为这里的大多数人都应该这样做。

编辑:此外,take a look at this.

答案 6 :(得分:0)

我会去上课,属性是私有的。

可以/应该在该课程中创建与学生信息相关的任何操作。

如果这是一次性的事情,我会选择数组,但实际上,我知道只有一次使用的东西意味着什么意味着我需要在数据,最终不得不上课。