PHP nesneler için kısa el sözdizimi özelliği yok?

9 Cevap php

Javascript olarak kolayca böylece gibi nesneler ve Dizileri oluşturabilirsiniz:

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

Are simialar things possible in PHP?
I know that you can easily create an array using the array function, that hardly is more work then the javascript syntax, but is there a similar syntax for creating objects? Or should I just use associative arrays?

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

So to summarize:
Does PHP have javascript like object creation or should I just use associative arrays?

9 Cevap

Basit nesneler için, bir nesneyi almak için ilişkisel dizi sözdizimi ve döküm kullanabilirsiniz:

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

Ancak bunu kolayca (sizin yapısı bu kadar basit olsaydı, sadece bir ilişkisel dizi olarak bırakacaktı) nasıl yararsız görebilirsiniz bakıyor.

A proposal to implement this array syntax yoktu. But it was declined.


Update diziler için kısaltılmış sözdizimi, uğramış kabul ve way be released with PHP 5.4 şimdi değil.

Ama yine de nesneler için hiçbir kestirme yoktur. Muhtemelen açıkça artığını gerekir object:

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

Merhaba ben aslında bunun için bir cevap arıyorum bu soruya geldi.

Dahası, uygun bir çözüm arayan Stoyan Stefanov 'nin blogundan bir mesaja götürdü.

http://www.phpied.com/javascript-style-object-literals-in-php/

Sabırsızlar için: (Eğer gerçekten bir blog yazısı okumak gerektiği halde), o aşağıdaki sınıf yazma önermektedir:

class JSObject {
    function __construct($members = array()) {
        foreach ($members as $name => $value) {
            $this->$name = $value;
        }
    }

    function __call($name, $args) {
        if (is_callable($this->$name)) {
            array_unshift($args, $this);
            return call_user_func_array($this->$name, $args);
        }
    }
}

O sağlayan aşağıdaki kod gibi kullanılabileceği:

$fido = new JSObject(array(
    'name' => "Fido",
    'barks'=> true,
    'say'  => function($self) {
        if ($self->barks) {
            return "Woof";
        }
    }
));

echo $fido->say(); // "Woff"

PHP 5.4 itibariyle bunu yapabilirsiniz:

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

Bu çok kısa değil, ama (tamamen nadir değildir) sabit kodlanmış iç içe diziler bir sürü kullanmak gerekiyorsa bunu takdir edeceksiniz.

Eğer bir nesneyi isterseniz, yine her dizi döküm gerekir:

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

Json_decode fikir gibi, bu yazdı:

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);

Yeni PHP sözdizimlerinin göre,

Sen kullanabilirsiniz

$array = [1,2,3];

Ve ilişkisel diziler için

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

Nesneler için, nesnenin dizi typecasting yapabilirsiniz

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

Orada PHP hiçbir nesne steno, ama sen json_encode ve json_decode işlevleri kullanmak şartıyla, Javascript kesin sözdizimini kullanabilirsiniz.

Yöntem çok iyi crescentfresh eserler verilmiştir ama ben nesneye daha fazla özellik ekleyerek bir sorun vardı. Bu sorunu aşmanın ben spl ArrayObject uygulanmaktadır.

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";

Eğer kolay hatta diziler nesneleri oluşturmak için yapmak için bu yaklaşım ile yapabileceğiniz bir çok şey bu yardımcı olur umarım vardır.

Ben bu yüzden inanmıyorum, ama bu ne gibi öğeleri erişim fayda olacaktır:

anObject.foo

yerine:

anArray['foo']