Ruby bağımlısı dizeleri PHP altifadelerle arıyor

5 Cevap php

Color = "turuncu" varsayalım;

Ruby:

puts("My favorite color is #{color.downcase() + 'ish'} -- at least for now.");

PHP:

print("My favorite color is {strtolower( $color ) + 'ish'} -- at least for now.");

Ben bunu istiyorum gibi PHP sürümü çalışmıyor. Ben herhangi bir dil savaşları aramıyorum, ben sadece herkes PHP bu özel konuda daha Ruby gibi olmak için bir yol bilen varsa bilmek istiyorum.

Herkes bir Ruby bağımlısı PHP-arazi yaptığı rutin ziyaretler için ayarlamanıza yardımcı olabilir? Oralarda bir yerde 'hareket-like-Ruby'nin' modülü var mı? Bu zarar başlıyor.

5 Cevap

Böyle dizeleri içinde düz işlevleri çağırmak değil, ancak garip şeyler yapmaya çözümleyici ikna edebilirsiniz:

<?php
print "{$a->b()}"; // Works

//Parse error: syntax error, unexpected '(' in Command line code on line 1
print "${time()}";

print "${$a=time()} $a"; // Also works: prints "1234380996"
?>

Sürece başında geçerli bir değişken olarak görür, devam edin ve şikayet olmadan bütün bir deyim sokmak olacak.

Evet, merak edenler için, bu çok çalışıyor ...

<?php
print "${$a or print shell_exec('ls')}";
?>

Sen yakınsın, dizelerde değişkenleri embed, ancak çağrı fonksiyonu olamaz.

Ben aynı adı C fonksiyon etrafında ince bir sarıcı olan printf() kullanmak (ve sprintf()) Bunun için:

printf('My favorite color is %sish -- at least for now.', strtolower( $color ));

Orada o %s bakın? Yani 2. argüman olarak geçiyoruz dize veri türü için yer tutucu.

sprintf() aynı şekilde çalışır, ancak bunun yerine print'ing biçimlendirilmiş dize döndürür.

Yalnızca diğer seçenekler şunlardır:

A. işlevi Sahne ilk ve değişkene son sonuç atama çağırır:

$color = strtolower( $color );
print("My favorite color is {$color}ish -- at least for now.");

IMO biraz çirkin B. kullanarak birleştirme:

print('My favorite color is ' . strtolower( $color ) . 'ish -- at least for now.');

Sen tek tırnak (aka keneler) ve çift tırnak benim kullanımını fark etmişsinizdir.

Yukarıdaki "A" gördüğünüz gibi PHP, çift tırnak içine değişmezleri, değişkenler için ayrıştırıldı.

Tek tırnak içine değişmezleri ayrıştırıldı değil. Bu nedenle, daha hızlı konum. Ayrıştırılması için bir değişken olduğu zaman, bir kural olarak, sadece değişmezleri etrafında çift tırnak kullanmanız gerekir.

'My favorite color is ' . strtolower( $color ) . 'ish-- at least for now.'

Ben PHP dizeleri yansıtılmadan tam ifadeleri destekler sanmıyorum. Ama herhangi bir PHP yaptım çünkü bir süre oldu.

Eğer bu şey gider ....

class ColorIsh {
    var $color;

    function __constructor($color) { $this->color = $color; }
    function __get($prop) {
        if ($prop == 'ish') {
            // code here fixing suffix if needed
            return strtolower($this->color) . 'ish';
        }
        return '';
    }
    function __set($prop) {}
}

$color = new ColorIsh("orange");
$str = "My favorite color is $color->ish -- at least for now.";

Ve hiper gelişmiş versiyonu

class ColorIsh {
    private $color;

    function __constructor($color) {$this->color = $color; }
    function __get($prop) {
        if ($prop == 'color') 
            return $this->color;
        if ($prop == 'ish')
            return isset($this->ish) ? $this->ish : $this->color . 'ish';
        return false;
    }
    function __set($prop, $value) {
        if ($prop == 'color') { $this->color = $value; unset($this->ish); }
        if ($prop == 'ish') { $this->ish = $value; }
    }
}

$color = new ColorIsh('orange');
$color->ish = 'orangish';
print "The color is kinda $color->ish";
$color->color = 'green';
print "The color is kinda $color->ish";

output:
The color is kinda orangish.
The color is kinda greenish.

Mümkün değil. Eğer gerçekten ısrar Ama eğer, her zaman akıcı bir arayüz ile bir String sınıfı oluşturabilirsiniz ... Ama bu çılgınlık :)