使用PHP对象

时间:2011-06-03 18:32:01

标签: php

我以前主要用PHP编写脚本,现在考虑对它“更严肃”:)

我正在一个徒步旅行网站上工作,我需要将一些值放入一个对象中,然后我尝试将其传递回调用代码。

我试过这样做:

$trailhead = new Object ();

但这种系统对我不利。

然后我根本没有声明对象,并开始像这样使用它:

$trailhead->trailhead_name = $row['trailhead_name'];
$trailhead->park_id = $row['park_id'];

这似乎合理地工作了。但至少有3个问题:

  1. 由于在从数据库获取内容时执行该代码,如果有多行,我该怎么办?

  2. 当我将$ trailhead传递回调用代码时,变量为空

  3. 我实际上可能更喜欢为Trailhead制作一个真实的对象:

    class Trailhead
    {
        private $trailhead_name;
        private $park_id;
        private $trailhead_id;
    
        public function __construct()
        {
            $this->trailhead_name    =    NULL; 
            $this->park_id    =    NULL; 
            $this->trailhead_id    =    NULL;     
        }
    }
    
  4. 在这些情况下,人们通常会做些什么?我的方法在哪里出错?我知道它不止一个地方:)

3 个答案:

答案 0 :(得分:4)

  1. $trailheads[] = $trailhead;
  2. 我会print_r() $trailhead来检查它是否符合您的预期。 PHP中的默认对象类型为stdClass
  3. 是的,那会更好,因为它会让你的Trailhead个对象具有功能。你目前正在这样做的方式基本上没有利用PHP的任何对象功能 - 它本质上是一个语法略有不同的数组。

答案 1 :(得分:3)

我认为你应该首先与某些基础知识“联系”。 PHP中的对象有一段历史。它们是数组的相对对象,有两种对象:

  • 数据对象
  • 类对象

数据对象被称为stdClass,这实际上是您最初寻找的内容:

$trailhead = new Object();
PHP中的

写成:

$trailhead = new stdClass;

(末尾有或不带括号,两者都有效)

然后,您可以动态地向其添加成员,就像您在第二部分中所做的那样,而不是声明变量(在PHP中也是如此):

$trailhead->trailhead_name = $row['trailhead_name'];
$trailhead->park_id = $row['park_id'];

如果您想更快地将$ row转换为对象,只需cast

$trailhead = (object) $row;

这也是另一种方式:

$array = (array) $trailhead;

如您所见,PHP中基于数据的基础对象不会隐藏它们与数组数据类型的关系。事实上,你甚至可以对它们进行迭代:

foreach($trailhead as $key=>$value) {
    echo $key, ' is ', $value, "<br>\n";
}

你可以在PHP手册中找到很多关于这方面的信息,它有点散布,但是在重复大量名称之前,值得了解一些基础知识,只是为了传递属于一起的数据。

在这些或多或少的愚蠢数据对象旁边,您可以编写完整的类 - 在每个stdClass可以执行的操作旁边 - 可以拥有代码,可见性,继承以及所有可以构建好东西的东西 - 但这可以是pretty complex as the topic is larger

所以它总是取决于你需要什么。但是,这两种类型的对象都是“真实对象”,两者都应该有效。

class myClass {
    function importArray(array $array) {
        foreach($array as $key=>$value) {
            if(!is_numeric($key)) $this->$key=$value;
        }
    }
    function listMembers() {
        foreach($this as $key=>$value) {
            echo $key, ' is ', $value, "<br>\n";
        }
    }
}

$trailhead = new myClass();
$trailhead->importArray($row);

echo $trailhead->park_id;

请记住,除了创建一组仅在每个对象(存储数据)中执行相同操作的对象之外,您应该只使用一个灵活处理作业的灵活类(例如stdClass),因为这将保留您的代码更清洁。

您可以花时间考虑如何使数据库层更加模块化等,而不是编写getter / setter狂欢。

答案 2 :(得分:1)

回传一个数组:

$trailhead = array(
    'trailhead_name' => $row['trailhead_name'],
    'park_id' => $row['park_id'],
    'trailhead_id' => $row['trailhead_id'],
)

然后访问它:

$trailhead['park_id'];

或使用漂亮的list()将其读入变量:

list($trailhead_name, $park_id, $trailhead_id) = $trailhead;