首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有(n深度)对象getter的Isset

带有(n深度)对象getter的Isset
EN

Stack Overflow用户
提问于 2012-09-24 17:23:37
回答 3查看 373关注 0票数 0

使用Doctrine的Zend-Framework项目。数据以对象的形式出现。在我的Zend视图中,我访问它的方式如下

代码语言:javascript
运行
复制
$this->personData->getPersonAdress()->getPersonStreet();

由于Person可能没有关联的地址,因此在回显之前,我们必须检查personadress是否存在以及personStreet是否已填满,否则可能会出现回显NULL错误。

因此,我们在isset中使用一些IFs:

代码语言:javascript
运行
复制
<? if($this->personData->getPersonaddress()) echo $this->personData->getPersonaddress()->getPersonstreet(); else echo "''"?>

示例(最坏情况):

代码语言:javascript
运行
复制
<?
   if(isset($this->address[0]) && is_object($this->address[0]))
   {
      $help2=$this->address[0]->getAddress();
      if (isset($help2) && is_object($help2))
      {
         $help=$this->address[0]->getAddress()->getCountry();
         if (isset($help) && is_object($help) && $help->getCountryId())
         {
            echo $this->address[0]->getAddress()->getCountry()->getCountryId();
         }
      }
   }
?>

我们需要一个解决方案,或者最终是一个Zend_view帮助器来简化响应这些值的过程。

任何想法都将受到高度赞赏..

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-25 23:11:44

我自己解决了这个问题,实现了一个Zend View Helper,它打印出每个值,忽略非对象属性或NULL关联可能发生的错误。这对使用Zend Framework + Doctrine 2的每个人都很有用。

用法

而不是

$this->address->getAddress()->getCountry()->getCountryId()

Use (如果未设置,则提供值或默认值(0,第三个参数))

$this->Printsafe($this->address,"getAddress/getCountry/getCountryId",0)

代码跟随

代码语言:javascript
运行
复制
class Printsafe extends Zend_View_Helper_Abstract {

    public function isObjectOrSet($data, $properties)
    {
        if ($data != null)
        {
            if(is_object($data))
            {
                if (isset($properties[0]))
                {
                    $actual_property = array_shift($properties);
                    return $this->isObjectOrSet($data->{$actual_property}(), $properties);
                }
            }
            elseif(isset($data))
            {
                return $data;
            }
            else
                return null;
        }
        else
            return null;
    }

    /**
    * Wants data and getters + properties
    * Tests if they are set and returns requested value
    * Returns empty value (instead of NULL) if any error occurs
    * 
    * @param  mixed $data - Example $this->personData
    * @param  string $properties - Example "getPersontype/getNotation"
    * @param  mixed $default - return value if not set. Default is empty string. 
    * 
    * @return mixed $value
    */
    public function printsafe($data = null, $properties='', $default = '') {

        $return = null;

        if ($data != null)
        {
            if ($properties != '')
            {
                $prop_array = explode("/", $properties);
                $return = $this->isObjectOrSet($data, $prop_array);
            }
        }

        if ($return == null)
            $return = $default;

        return $return;
    }
}
票数 0
EN

Stack Overflow用户

发布于 2012-09-24 17:28:07

您可以使用HYDRATE_ARRAY告诉Doctrine返回一个数组,而不是映射的对象。

这样,就可以直接调用isset()。

票数 0
EN

Stack Overflow用户

发布于 2012-09-24 20:40:50

你可以用@作为链的前缀,这会抑制错误输出--这样你就不需要检查它了。如果它不存在,它将不会输出任何内容。

代码语言:javascript
运行
复制
<?php echo @$this->personData->getPersonAdress()->getPersonStreet(); ?>

通常不推荐使用@运算符,但在这种情况下,它似乎是一个合适的解决方案。(缺点是您可能会遗漏可能来自此行的其他错误)

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12562156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档