PHP kendi sözdizimi teşrih miyim?

7 Cevap

PHP kendi sözdizimi teşrih miyim? Örneğin, $object->attribute gibi bir giriş alır ve kendisi diyor bir fonksiyon yazmak istiyorum:

Tamam, o $foo bar adlı bir özelliği olan bir nesne olduğunu düşünmek gerekir anlamına gelir $foo->bar bana veriyor. I bar erişme deneyin ve potansiyel olsun önce bir hata 'non-nesne özelliğini almaya çalışırken', me $foo hatta bir nesne olup olmadığını kontrol edelim.

Nihai hedef echo a value if it is set, and fail silently if not etmektir.

Ben böyle tekrarını önlemek istiyorsanız:

<input value="<? if(is_object($foo) && is_set($foo->bar)){ echo $foo->bar; }?> "/>

... Ve yukarıda, ama bu gibi nesne ve ayrı ayrı geçti niteliği sahip olması gereken bir işlevi yazma önlemek için:

<input value="<? echoAttribute($foo,'bar') ?>" />

Ama ... instead hangi bir şey yazmak için:

  • object-> öznitelik sözdizimi korur
  • esnektir: Ayrıca dizi tuşları veya düzenli değişkenleri işleyebilir

Bu gibi:

<input value="<? echoIfSet($foo->bar); ?> />
<input value="<? echoIfSet($baz['buzz']); ?> />
<input value="<? echoIfSet($moo); ?> />

Ama bu tüm PHP göre benim işlevi her işleyebilir ki, "Ben $object->attribute veya $array[$key] derken ne tür bir şey ben soruyorum" Bana söylemek mümkün olmasına bağlıdır onun Kendi türü.

Is this possible?

Update

Ben burada bazı iyi cevaplar var ve bazı denemeler yaptım. Özetlemek istedim.

  • Benim özgün sorunun cevabı "hayır" gibi görünüyor ama biz başarmak için bir yol benim yapmaya çalıştığım oldu buldun. Techpriester I could bir işleve string '$ foo-> bar' geçmek ve bu ve eval() bunu ayrıştırmak zorunda olduğuna işaret etti. Ben değil almak istiyorum, ama yaklaşım bir anılmayı hak ediyor.
  • Peter Bailey bir işleve geçirilen almadan önce bir şey gibi $foo->bar değerlendirildi alır dikkat çekti. Ben bu düşünce, ama nedense yoktu gerekirdi. Teşekkürler, Peter!
  • Will Vousden referans $foo->$bar geçen işlev daha ziyade önceden değerlendirilir yerine, bunu değerlendirmek için izin verdiğini gösterdi. Onun işlevi $foo Bilmiyordum bir nesne, değilse isset($foo->bar) şikayetçi olmayacağını gösteriyor.

Daha da ilginci, onun örnek ima görünüyor PHP waits to evaluate a variable until it absolutely has to.

If you're passing something by value, then of course PHP has to determine the value right then. Bu gibi:

$foo->bar = 'hi';
somefunction($foo->bar); // same as somefunction('hi');

Aslında ihtiyacı olduğunda Ama geçen iseniz by reference, bu değerini belirlemek için sabırsızlanıyorum.

: (Şeyler sırayla aşağıdaki) bu gibi

echo ifSet($foo->bar); // PHP has not yet evaluated $foo->bar...
function ifSet(&$somevar){ // ...because we're passing by reference (&$somevar)
  // Now we're inside the function, but it still hasn't evaluated $foo->bar; it 
  // just made its local variable, $somevar, point to the same thing as $foo->bar
  if(isset($somevar)){ // Right HERE is where it's evaluated - when we need it
    return $bar;
  }
}

Cevap herkese teşekkürler! Bir şey yanlış beyan ettiyseniz, lütfen bana bildirin.

7 Cevap

Başvuruyla iletebilirsiniz:

<?php

function foo(&$bar)
{
    if (isset($bar))
    {
        echo "$bar\r\n";
    }
    else
    {
        echo "It's not set!\r\n";
    }
}

$baz = new stdClass;
$baz->test = 'test';
foo($baz->test);
foo($baz->test2);

$baz = array();
foo($baz['test3']);

?>

Bir dizi ya da tam tersi olarak bir nesneye erişmeye çalışırsanız bu işe unutmayın.

Eğer olsa, çok fazla böyle bir şey güvenmek için denemek gerekir.

Belki bu çok özel durumda size @ sembolünü kullanabilirsiniz:

<input value="<?php echo @$foo->bar; ?> "/>

Eğer böyle bir şey yapmak mümkün asla nedeni

echoIfSet($foo->bar);

Onun işleve gönderilen önce $foo->bar değerlendirilir çünkü. Bu değer bir dize ise, echoIfSet() tüm göreceksiniz bir dize - bu dizge bir nesnenin özelliğinden geldiğini hiçbir fikri yok.

Yani, no, bir kelime. PHP "kendi sözdizimi incelemek" olamaz

Eğer (_ get()/ _set () veya yansıma kullanarak) var her seçenek önlemek için çalışıyoruz ne daha fazla kod ve çalışma gerektirir - ve hala ne istediğinizi tam olarak alamadım.

Özel bir dizide diziyi en ve nesneleri sarma. PHP sihirli yöntemler kullanılarak özelliklerini acces olabilir.

class wrap implements ArrayAccess{
  private $fields=array();
  function __get($name){
    if(isset($this->fields[$name])){
      return $this->fields[$name];
    }
  }
  function __set($name, $value){
    $this->fields[$name] = $value;
  }
  // with function isset()
  public function offsetExists($offset) {
    return isset($this->$fields[$offset]);
  }

  public function offsetGet($offset) {
    return $this->$fields[$offset];
  }

  public function offsetSet($offset, $value) {
    return $this->$fields[$offset] = $value;
  }

  public function offsetUnset($offset) {
    unset($this->$fields[$offset]);
  }
}

bu sen istediğin her şeyi yapmak için izin wil.

Sadece eval deyimi arıyorsunuz?

Eğer gibi, size geçirilen değişkenin adını veren bir şey arıyorsanız:

function foo($variable)
{
    echo variableName($variable);
}

$test = "Hello World";
// echoes "test"
foo($test);

Sonra onu bulmak için gidiş değildir. PHP gibi bir özelliği yoktur.