目前,我正在创建一个脚本,用于解析传递给它的特定类型报告中的信息。脚本的一部分将从报告中提取学生信息并保存以供以后处理。
最好是以类的形式或数组变量来保存它吗?我认为我可以使用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 */
答案 0 :(得分:3)
您可以为单个学生创建一个课程,为单个学生提供适当的操作,例如更新成绩或获取全名(具有访问功能的私有数据成员)。然后为包含一系列单个学生的多个学生创建另一个班级。您可以创建对学生组进行操作的功能,根据需要测试和调用各个学生功能。
高级答案是您可以按照您的建议任何方式执行此操作,但我们大多数人都会推荐OOP解决方案。如果您的需求非常简单,那么简单的数组就足够了。如果您的需求发生变化,您可能不得不为对象重新编码整个事物。类也可以保持简单,所以我建议你从类开始并根据需要增加复杂性。我相信从长远来看,它会更好地维持和扩展,并且可以通过课程来构建。
答案 1 :(得分:3)
尝试优化数组与简单值对象的使用可能是不必要的微优化。对于最简单的情况,数组更快,因为您没有构造new
对象的开销。
重要的是要记住这一点:数组不是唯一存在的数据结构。如果您不需要哈希功能,简单的SplFixedArray
docs将导致较低一旦超过对象创建的初始开销,就会产生内存开销和更快的迭代。如果您要存储大量数据,则上述固定数组或其他SPL data structures之一可能是更好的选择。
最后:值对象应该是不可变的,所以在你的情况下,我强烈建议一个对象提供的封装,而不是无情地分配哈希映射值的能力。如果您希望使用数组表示法的简单性,请让您的类实现ArrayAccess
docs并充分利用这两个世界。有人会建议使用__get
和__set
的魔法吸气剂和制定者。我不会,因为魔术通常会不必要地混淆你的代码。如果你真的需要魔法,你可能会重新考虑你的设计。
有一个原因可以解释为什么OOP范式被认为是我们提出的最佳编程范例 - 因为它是我们提出的最佳范例。你应该使用它。避免陷入许多/大多数使用数组的PHP开发者的陷阱。
答案 2 :(得分:1)
关于性能问题,类可能比数组更快,因为不同的实例是独立存储的。通过将所有内容放在一个巨型哈希映射(关联数组)中,您还可以获得数组的一些限制/属性。例如,订购。你不需要那个。此外,如果PHP解释器不是智能的,它会在每次查找时散列您的查找字符串。使用不必要的类和静态类型。
答案 3 :(得分:1)
3个选项有效,但与外界有不同程度的封装/保护。
从最低保护到最高保护:
选择在很大程度上取决于项目的环境(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)
我会去上课,属性是私有的。
可以/应该在该课程中创建与学生信息相关的任何操作。
如果这是一次性的事情,我会选择数组,但实际上,我知道只有一次使用的东西意味着什么意味着我需要在数据,最终不得不上课。