【问题标题】:Does PHP feature short hand syntax for objects?PHP 是否具有对象的简写语法?
【发布时间】:2010-10-02 03:09:48
【问题描述】:

在 javascript 中,您可以像这样轻松地创建对象和数组:

var aObject = { foo:'bla', bar:2 };
var anArray = ['foo', 'bar', 2];

在 PHP 中可以实现类似的事情吗?
我知道您可以使用数组函数轻松创建数组,这几乎没有 javascript 语法更多的工作,但是创建对象是否有类似的语法?还是应该只使用关联数组?

$anArray = array('foo', 'bar', 2);
$anObjectLikeAssociativeArray = array('foo'=>'bla',
                                      'bar'=>2);

总结一下:
PHP 是否有类似 javascript 的对象创建功能或者我应该只使用关联数组?

【问题讨论】:

  • 我不知道.. 你为什么要这样做?相比之下,Javascript 如此有限?应正确描述对象,并​​带有范围和提示等。
  • 您是否有机会更改已接受的答案?这个问题的答案在过去 6 年中发生了变化。 :)
  • *简写总是一个词。

标签: php object


【解决方案1】:

对于简单的对象,可以使用关联数组语法和强制转换来获取对象:

<?php
$obj = (object)array('foo' => 'bar');
echo $obj->foo; // yields "bar"

但是看着它,你可以很容易地看出它是多么的无用(如果你的结构那么简单,你可以将它作为一个关联数组保留)。

【讨论】:

  • 嗯,很好,我可以看到一些可以使用的情况,谢谢!
  • 是的,在这种情况下,我不妨使用普通的关联数组。
  • $goose-&gt;foo$goose['foo'] 漂亮得多。 ∴有用。
  • 使用对象更容易,因为如果你有一个复杂的对象、数组和映射结构,你可以从$group["id123abc"]["people"][0]["name"]$group["id123abc"]-&gt;people[0]-&gt;name。这样更容易掌握数组、地图和对象或结构之间的区别
【解决方案2】:

有一个proposal to implement this array syntax但被拒绝了。


更新    数组的缩短语法已被重新讨论和接受,现在位于way be released with PHP 5.4

但是仍然没有对象的简写。您可能需要显式转换为 object

$obj = (object) ['foo'=>'bla', 'bar'=>2];

【讨论】:

  • 这已在 PHP 5.4 中实现。
  • @Gumbo 短数组语法使用=&gt; 而不是:。为您编辑了答案。 :)
  • 我想知道是否会实现对象的速记符号?我一直在使用 stdClasses,但与 javascript 对象文字相比,它们感觉很尴尬。
  • 此方法在类变量声明中不起作用。例如protected $test = (object) ['prop'=&gt;'val']; 不起作用。
  • 是的,这种方法现在可以工作了,但如果有$obj = {'foo'=&gt;'bla'} 肯定会很好
【解决方案3】:

从 PHP 5.4 开始,您可以这样做:

$array = ['foo'=>'bla', 'bar'=>2];

它并不短,但如果您需要使用大量硬编码的嵌套数组(这种情况并不少见),您将不胜感激。

如果你想要一个对象,你仍然需要转换每个数组:

$object = (object) ['foo'=>'bla', 'bar'=>2];

【讨论】:

    【解决方案4】:

    根据新的 PHP 语法,

    你可以使用

    $array = [1,2,3];
    

    对于关联数组

    $array = ['name'=>'Sanket','age'=>22];
    

    对于对象,您可以将数组类型转换为对象

    $object = (object)['name'=>'Sanket','age'=>22];
    

    【讨论】:

      【解决方案5】:

      PHP 中没有对象简写,但您可以使用 Javascript 的确切语法,前提是您使用 json_encodejson_decode 函数。

      【讨论】:

      • 有趣的想法,虽然这不是将解析延迟到运行时吗?什么时候这比使用 (object) 投射数组更有优势?
      【解决方案6】:

      crescentfresh 提供的方法效果很好,但是我在向对象附加更多属性时遇到了问题。为了解决这个问题,我实现了 spl ArrayObject。

      class ObjectParameter extends ArrayObject  {
           public function  __set($name,  $value) {
              $this->$name = $value;
          }
      
          public function  __get($name) {
            return $this[$name];
          }
      }
      
      //creating a new Array object
      $objParam = new ObjectParameter;
      //adding properties
      $objParam->strName = "foo";
      //print name
      printf($objParam->strName);
      //add another property
      $objParam->strUser = "bar";
      

      您可以使用这种方法做很多事情,让您甚至可以从数组中轻松创建对象,希望对您有所帮助。

      【讨论】:

        【解决方案7】:

        就像 json_decode 的想法,这样写:

        function a($json) {
         return json_decode($json, true); //turn true to false to use objets instead of associative arrays
        }
        
        //EXAMPLE
        $cat = 'meow';
        
        $array = a('{"value1":"Tester", 
          "value2":"'.$cat.'", 
          "value3":{"valueX":"Hi"}}');
        
        print_r($array);
        

        【讨论】:

          猜你喜欢
          • 2019-01-23
          • 2021-03-29
          • 1970-01-01
          • 1970-01-01
          • 2021-07-16
          • 2011-05-15
          • 2017-06-27
          • 2019-02-06
          相关资源
          最近更新 更多