【问题标题】:Variable as an object and/or array变量作为对象和/或数组
【发布时间】:2014-08-28 20:39:20
【问题描述】:

我问我的问题,我想在 php 中检测变量必须是对象还是数组...

这是我的代码: Dispatcher.php

<?php
class Dispatcher {
   var $request;

   public function __construct(){
      $this->request = new Request();
      var_dump($this->request->query);
   }
}

?>

请求.php

<?php
class Request {
   public $query = false;
   public function __construct(){
      if(!empty($_GET)){
         $this->query = array();
         foreach($_GET as $k => $v) {
            $this->query[$k] = $v;
         }
         //I need help here for mix array and stdClass();
      }
   }
}
?>

我还想使用$this-&gt;request-&gt;query['page'](数组)和作为对象:$this-&gt;request-&gt;query-&gt;page with stdClass(); 但我不知道该怎么做......

感谢您的帮助... :)

(抱歉我的英语不好,我是法国人;)...)

【问题讨论】:

  • 想一想:PHP 有ArrayAccess。这是您通过同一个变量获得数组和客观访问的唯一方法。不过,说实话,这可能不值得麻烦。 (对象不适用于array_map 等)只需选择一个。

标签: php arrays object stdclass


【解决方案1】:

使用ArrayObject

$this->query = new ArrayObject($_GET, ArrayObject::ARRAY_AS_PROPS);

// use it in dispatcher
echo $this->request->query['page'];
echo $this->request->query->page;

// your also able to iterate
foreach ($this->request->query as $key => $value) {
    echo $key.'=>'.$value.'<br>';
}

【讨论】:

  • 非常感谢 ArrayObject!
【解决方案2】:

您可以使用强制转换将数组转换为对象(我认为从 PHP 5.4 开始)。

对于对象(stdclass),它不会造成任何伤害。

$arr = array('foo'=>'bar');

$obj = (object) $arr;

echo $obj->foo;

【讨论】:

    【解决方案3】:

    尝试类似:

    if(is_array($this->request->query))
    {
       echo $this->request->query['page'];
    }
    elseif(is_object($this->request->query))
    {
       echo $this->request->query->page;
    }
    else
    {
       echo "not array or object";
    }
    

    【讨论】:

    • 听说过 DRY 吗?这伤害了我的眼睛。
    • @MightyPork 你的眼睛一定被缺少的分号弄疼了,不是因为这里不适用 DRY。
    • 谢谢你们!现在我知道 Dry 是什么,我用分号更正了我的行...(这是为了将 is_array 和 is_object 呈现为不是最佳代码)
    • @CharlotteDunois 哦,这里确实适用。如果您将查询转换为对象,如我的回答中所示,您不必复制这么多代码。
    • @MightyPork 如果您使用 PHP 5.4,则无法转换 >。这就是在某些主机上的情况(说真的,这很恶心)。
    猜你喜欢
    • 2011-07-24
    • 2014-12-13
    • 1970-01-01
    • 2015-10-08
    • 2015-09-08
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多