KO3:模拟 Kohana_ORM 模型的属性

发布于 2024-09-18 01:50:35 字数 617 浏览 9 评论 0原文

假设我有一个非常简单的模型,如下所示:

class Model_Person extends ORM
{
 /*
     CREATE TABLE `persons` (
   `id` INT PRIMARY KEY AUTO_INCREMENT,
   `firstname` VARCHAR(45) NOT NULL,
   `lastname` VARCHAR(45) NOT NULL,
   `date_of_birth` DATE NOT NULL,
  );
 */
}

有没有办法添加带有全名的假装属性?

例如,我可以这样做:

$person = ORM::factory('person', 7);
echo $person->fullname;

而不是这样:

$person = ORM::factory('person', 7);
echo $person->firstname.' '.$person->lastname;

另一个例子可以是一个 is_young 属性,该属性将计算人的年龄并在年龄低于某个数字时返回 true。

Say I have a very simple model that looks like this:

class Model_Person extends ORM
{
 /*
     CREATE TABLE `persons` (
   `id` INT PRIMARY KEY AUTO_INCREMENT,
   `firstname` VARCHAR(45) NOT NULL,
   `lastname` VARCHAR(45) NOT NULL,
   `date_of_birth` DATE NOT NULL,
  );
 */
}

Is there a way I can I add sort of a pretend property with the full name?

So that I for example could do this:

$person = ORM::factory('person', 7);
echo $person->fullname;

instead of this:

$person = ORM::factory('person', 7);
echo $person->firstname.' '.$person->lastname;

Another example could be an is_young property that would calculate the persons age and return true if the age was below a certain number.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

恰似旧人归 2024-09-25 01:50:37

您可以在application/classes/ORM.php中执行以下操作
application/classes/orm.php for Kohana 3.2 之前的版本):

<?php
class ORM extends Kohana_ORM {
    public function __get($name) {
        $getter = 'get_' . $name;
        if (method_exists($this, $getter)) {
            return $this->$getter();
        }

        return parent::__get($name);
    }
}

然后您只需向模型类添加一个方法即可:

public function get_fullname() {
    return $this->firstname . ' ' . $this->lastname;
}

并能够将其作为属性进行访问。

You can do the following in application/classes/ORM.php
(application/classes/orm.php for Kohana prior to 3.2):

<?php
class ORM extends Kohana_ORM {
    public function __get($name) {
        $getter = 'get_' . $name;
        if (method_exists($this, $getter)) {
            return $this->$getter();
        }

        return parent::__get($name);
    }
}

Then you can just add a method to your model class:

public function get_fullname() {
    return $this->firstname . ' ' . $this->lastname;
}

And be able to access it as a property.

沩ん囻菔务 2024-09-25 01:50:36

您可以使用“神奇”的 __get() 方法,如下所示:

public function __get($column)
{
    switch($column)
    {
        case 'fullname' : 
            return $this->firstname.' '.$this->lastname;

        case 'is_young' :
            // calculate persons age
    }
    return parent::__get($column);
}

或者您可以创建其他方法,例如 fullname()age() (似乎对我更好)。

You can use "magic" __get() method like this:

public function __get($column)
{
    switch($column)
    {
        case 'fullname' : 
            return $this->firstname.' '.$this->lastname;

        case 'is_young' :
            // calculate persons age
    }
    return parent::__get($column);
}

Or you can create additional methods like fullname() and age() (seems better to me).

谜兔 2024-09-25 01:50:36

为什么不使用这个解决方案呢?

class Model_Person extends ORM 
{
      public function fullname()
      {
           return $this->firstname.' '.$this->lastname;
      }
 }

$person = ORM::factory('person', 1); 
echo $person->fullname();

Why not use this solution?

class Model_Person extends ORM 
{
      public function fullname()
      {
           return $this->firstname.' '.$this->lastname;
      }
 }

$person = ORM::factory('person', 1); 
echo $person->fullname();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文