Model KO3:Kohana_ORM模型上的假装属性

Model KO3:Kohana_ORM模型上的假装属性,model,kohana-3,kohana-orm,Model,Kohana 3,Kohana Orm,假设我有一个非常简单的模型,如下所示: 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, ); */ } publ

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

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,
  );
 */
}
public function __get($column)
{
    switch($column)
    {
        case 'fullname' : 
            return $this->firstname.' '.$this->lastname;

        case 'is_young' :
            // calculate persons age
    }
    return parent::__get($column);
}
有什么方法可以添加一个带有全名的假装属性吗

例如,我可以这样做:

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

$person = ORM::factory('person', 7);
echo $person->firstname.' '.$person->lastname;
另一个例子可能是
is_young
属性,该属性将计算人员年龄,如果年龄低于某个数字,则返回true。

您可以使用如下“magic”
\u get()
方法:

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,
  );
 */
}
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()
(对我来说似乎更好)。

为什么不使用此解决方案

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

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

您可以在
application/classes/ORM.php
application/classes/orm.php
适用于3.2之前的Kohana):


是的,这就是我最后要做的。尽管magic _; u get比方法更难看,但我仍然喜欢将属性保留为属性,将方法保留为方法。也许是因为我已经习惯了。。。删除了break语句。当您有返回时不需要它:)~offtop~是的,我知道
break
,但我总是在
案例的末尾添加它,这就像一个小习惯:)例如,如果我更改此方法并删除
return
(例如:
$result=…
),我可以很容易地忘记
break
…因为它与其他属性不同。