【问题标题】:How to check if model have particular property or not?如何检查模型是否具有特定属性?
【发布时间】:2012-06-14 06:51:41
【问题描述】:

我想创建一个新的模型类,它将在所有其他类中进行扩展。我想在管理员添加/编辑任何记录时自动设置一些字段。即 createdDate、createdIp、updatedDate、updatedIp..等。

现在我的问题并非所有字段都在所有模型中通用。所以我想检查对象是否有 createdDate 属性然后只设置它的值。如果没有条件并且模型没有 createdDate 成员,那么它将产生错误。下面是我正在尝试的代码。但它不起作用。

public function beforeSave()
{ 
            if(isset($this->createdDate))
                    die('this model have createdDate field');
            else
                    die('this model does not have createdDate field');
}

模型可能不直接,它可能会自动扩展数据库表相关类。下面是打印的对象。 createdDate 字段在私有列表中。

如果我使用的是var_dump(property_exists($this, 'createdDate'));,那就是假的。

AdvertisementRate Object
(
    [bannerLocation_search] => 
    [bannerType_search] => 
    [_md:private] => CActiveRecordMetaData Object
        (
            [tableSchema] => CMysqlTableSchema Object
                (
                    [schemaName] => 
                    [name] => tbl_advertisement_rate
                    [rawName] => `tbl_advertisement_rate`
                    [primaryKey] => advertisementRateId
                    [sequenceName] => 

                    [columns] => Array
                        (
                            [createdDate] => CMysqlColumnSchema Object
                                (
                                    [name] => createdDate
                                    [rawName] => `createdDate`
                                    [allowNull] => 
                                    [dbType] => datetime
                                    [type] => string
                                    [defaultValue] => 
                                    [size] => 
                                    [precision] => 
                                    [scale] => 
                                    [isPrimaryKey] => 
                                    [isForeignKey] => 
                                    [autoIncrement] => 
                                    [_e:private] => 
                                    [_m:private] => 
                                )

请帮我添加这个逻辑。


是的.. CActiveRecord 已扩展到我的班级。

MasterAdmin.php

class MasterAdmin extends CActiveRecord
{
    public function beforeSave()
    { 
                echo '<pre>';
                var_dump(property_exists($this, 'createdDate')); 
                exit;
    }
}

用户.php

class User extend MasterAdmin 
{
   // So whenever any record added or edited, beforeSave will be called and i can autoset createddate value.

}

【问题讨论】:

  • 这对你有帮助吗??? property_exists() .. 检查手册 - php.net/manual/en/function.property-exists.php 我认为这就是你正在寻找的
  • 查看您的打印对象不清楚您的beforeSave() 方法属于哪个对象,但无论如何createdDate 不是属性,它是属于@ 的columns 属性的数组键987654330@ 对象。假设 beforeSave 是该对象的一个​​方法,它会是 isset($this-&gt;columns['createdDate']) 但考虑到嵌套很难确定。
  • 你用的是什么框架?

标签: php oop object yii


【解决方案1】:

【讨论】:

  • 你看过我提供的链接了吗,$this->hasAttribute('createdDate') 应该做你想做的。
  • AR 中的属性而不是 db 中的列呢?这将返回 false,但类可能具有该属性,property_exists() 是更好的方法
【解决方案2】:

property_exists() 是你要找的。​​p>

这样,如果属性存在但设置为NULL,上述函数将如您所愿返回true,而isset() 将返回false,导致您认为该属性不存在。

为我工作。见example

【讨论】:

  • property_exists 返回我的错误。我有我更新的问题。请检查。
  • 在您的示例中,您使用了公共成员。正如我所说,这些属性是基于 mysql 表动态的。这是 YII 框架,我的类正在扩展框架的模型 CActiveRecord,例如“class myClass extends CActiveRecord”。所以我不能使用你的代码。希望你能理解。
猜你喜欢
  • 1970-01-01
  • 2021-03-12
  • 1970-01-01
  • 2019-04-30
  • 2012-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
相关资源
最近更新 更多