Bir nesne olarak Sayısal Keys ile bir dizi Döküm

4 Cevap php

Bir nesne olarak bir dizi döküm zaman PHPs döküm mekanizması çevresinde alay, ve garip bir durumda içine koştu edildi

$o = (object) array('1'=>'/foo/bar');	
$o = new stdClass();
var_dump($o);

Anladığım kadarıyla, PHP özellikleri PHP değişkenleri olarak aynı kuralları ile beyan edilmesi gerekmektedir. Yani A valid variable name starts with a letter or underscore, followed by any number of letters, numbers, or underscores. Ancak, yukarıdaki kod aşağıdaki çıktıyı üretir

object(stdClass)#1 (1) {
  [1]=>
  string(8) "/foo/bar"
}

Gerçekten garip alır nerede nesne bu bilgilere erişmeye çalıştığınızda olduğunu.

var_dump($o->1); 		// parse error
var_dump($o->{'1'}); 		// NULL	
var_dump(get_object_vars($o));  //array(0) { }

Raporları var_dump bilgilere ulaşmak için yine de var mı nesne, ya da sadece istek yaşam döngüsünün kalanı için kilitli? (Bu pratik kullanımı Ben sadece merak ediyorum, nil)

4 Cevap

Bir diziye geri döküm sürece Evet, onlar sadece kilitlenir. Eski sürümlerinde bir dizi olarak bir sabit tanımlamak, ama sonra onun öğelerine erişmek asla örneğin PHP birkaç küçük "Sorunlar" vardır. Hatta şimdi tekrar kaçınılmalıdır, bu oldukça öngörülemeyen behavoir neden olsa bir kaynak (örneğin, define('MYSQL',mysql_connect());) gibi bir sabit tanımlayabilir ve.

Genellikle, eğer mümkünse dizi-nesne atmalarını önlemek için en iyisidir. Eğer gerçekten bunu yapmak gerekirse, stdClass yeni bir örneğini oluşturmayı düşünün ve sonra el _0, _1, vb örneğin tüm değişkenleri, yeniden adlandırma

$a = array('cat','dog','pheasant');
$o = new stdClass;
foreach ($a as $k => $v) {
    if (is_numeric($k)) {
        $k = "_{$k}";
    }
    $o->$k = $v;
}

EDIT: Sadece bu hipoteze bir daha hızlı bir test yaptım, ve evet, onlar resmen nesne bağlamında "yoktur"; veri depolanan, ancak erişimi imkansız, ve bu nedenle nihai özel üyesidir. İşte test:

$a = array('one','two','three');
$o = (object)$a;
var_dump(property_exists($o, 1), property_exists($o, '1'));

Ve çıktı:

bool(false)
bool(false)

EDIT: İlginç yan not, aşağıdaki işlem geri false geliyor:

$a = array('one','two','three','banana' => 'lime');
$b = array('one','two','banana' => 'lime');

$y = (object)$a;
$z = (object)$b;

var_dump($y == $z);

Bu DiziNesnesi sınıf özelliklerine erişebilirsiniz görünür

$a = new ArrayObject($obj);
echo $a[0];

Ben bir nesne / altnesnesi Bir dizinin bir tamsayı anahtar döküm PHP Değişkenler adlandırma kurallarına kıracak çünkü bir hata alıyorum düşünüyorum.

İpuçları:

  • Bir OBJECT veya ARRAY sahip olmasını isteyip istemediğinizi eller önce karar verin
  • Tip döküm ile dikkatli olun (örn. (nesne) dizi (1 => 'string') böyle şeyler yapmayın)
  • Doğrulama için döküm kullanmak ve şeyleri dönüştürmek değil
  • "Sahte" dizileri gibi nesneleri kullanmaktan kaçının

Bir diziye geri döküm sürece Evet, onlar sadece kilitlenir.

Belki, özellikleri sadece doğrudan değil, hala orada ve erişilebilir. Ancak, ben kaynak kodunda daldı gibi foreach (bir dizi nesne artığını olabilir) nasıl çalıştığını emin değilim.

Örnek:

$array = array('one', 'two', 'three', 'four');
$obj = (object) $array;

foreach ($obj as $key => &$val) {
    print "$key -> $val<br>";
    $val = 'Nhaca';
    var_dump($obj);
}
print_r($obj);
print_r($array);

çıktı:

0 -> one
object(stdClass)[1]
  &string 'Nhaca' (length=5)
  string 'two' (length=3)
  string 'three' (length=5)
  string 'four' (length=4)
1 -> two
object(stdClass)[1]
  string 'Nhaca' (length=5)
  &string 'Nhaca' (length=5)
  string 'three' (length=5)
  string 'four' (length=4)
2 -> three
object(stdClass)[1]
  string 'Nhaca' (length=5)
  string 'Nhaca' (length=5)
  &string 'Nhaca' (length=5)
  string 'four' (length=4)
3 -> four
object(stdClass)[1]
  string 'Nhaca' (length=5)
  string 'Nhaca' (length=5)
  string 'Nhaca' (length=5)
  &string 'Nhaca' (length=5)
stdClass Object ( [0] => Nhaca [1] => Nhaca [2] => Nhaca [3] => Nhaca ) 
Array ( [0] => one [1] => two [2] => three [3] => four )