PHP Sınıflar için örtülü Tipi Dönüşüm?

6 Cevap php

Ben başka bir türü belirli bir örtük dönüştürme istediğiniz php complier anlamanın bir yolu var mı?

Basit bir örnek:

class Integer
{
  public $val;
}

function ExampleFunc(Interger $i){...}

ExamFunc(333); // 333 -> Integer object with $val == 333.

[Değiştir] ... Birisi bir örnek istedi. Burada c # bir örnek var. Bu defa erişilmiş sonra değerini değiştiren bir boolean türüdür.

    /// <summary>
    /// A Heisenberg style boolean that changes after it has been read. Defaults to false.
    /// </summary>
    public class hbool
    {
        private bool value;
        private bool changed = false;

        public hbool()
        {
            value = false;
        }

        public hbool(bool value)
        {
            this.value = value;
        }

        public static implicit operator bool(hbool item)
        {
            return item.Value;
        }

    	public static implicit operator hbool(bool item)
    	{
    		return new hbool(item);
    	}

        public bool Value
        {
            get
            {
                if (!changed)
                {
                    value = !value;
                    changed = true;
                    return !value;
                }
                return value;
            }
        }

        public void TouchValue()
        {
            bool value1 = Value;
        }

        public static hbool False
        {
            get { return new hbool(); }
        }

        public static hbool True
        {
            get { return new hbool(true); }
        }
    }

        [Test]
    	public void hboolShouldChangeAfterRead()
    	{
    		hbool b = false;
    		Assert.IsFalse(b);
    		Assert.IsTrue(b);
    		Assert.IsTrue(b);
    		hbool b1 = false;
    		Assert.IsFalse(b1);
    		Assert.IsTrue(b1);
    		Assert.IsTrue(b1);
    		hbool b2 = true;
    		Assert.IsTrue(b2);
    		Assert.IsFalse(b2);
    		Assert.IsFalse(b2);
    		bool b3 = new hbool();
    		Assert.IsFalse(b3);
    		Assert.IsFalse(b3);
    		Assert.IsFalse(b3);
    	}

6 Cevap

Long answer:

Ben bu durumda bir implicit dönüşüm yapmak için PHP için (impossible okuyun) çok zor olduğunu düşünüyorum.

Unutmayın: Eğer sınıf tamsayı dediğimiz aslında kodun insan okuyucuya bir ipucu, PHP aslında bir tamsayı tutmak için kullanılan olduğunu anlamıyor. Ayrıca, $ val adında bir niteliği vardır ki gerçeği muhtemelen tamsayı değeri içermelidir bir insan okuyucuya bir ipucu. Yine PHP kodunuzu anlamıyor, sadece çalıştırır.

Kodunuzda bazı noktada bir explicit dönüşüm yapmalıyız. PHP bunun için bazı güzel syntactig şeker olması mümkün olabilir, ancak bir ilk girişimi gibi bir şey olurdu:

class Integer
{
  public $val;

  function __construct($val) { $this->val = $val; }
}

function ExampleFunc($i){
    if (is_numeric($i)) { $iObj = new Integer($i); }
    ...
}

ExamFunc(333); // 333 -> Integer object with $val === 333.

Bu bunu istiyorum gibi serin değil, ama yine PHP daha fazla ya da daha az açık dönüşüm gizlemek bazı sözdizimsel şeker sahip olması mümkündür.

Short version:

Bir yol ya da başka, bir explicit dönüşüm gerekir

PHP5 has type hinting, with limitations: http://ca2.php.net/manual/en/language.oop5.typehinting.php

Belirtilen tür nesneler ya da array, bu nedenle bu tür string ve int izin verilmez gibi türleri inşa edilmelidir.

Bu bir dönüşüm değil, belirtilen türde bir nesne yöntemi veya işleve geçirilen değilse sizin örnekte olduğu gibi, bir hata atmak olacaktır.

Hayır, PHP güçlü yazılmış bir dil değildir.

Eğer döküm yazın nasıl soruyorsunuz? Sen yapabilirsin:

$ php -r 'var_dump("333");'
string(3) "333"
$ php -r 'var_dump((int)"333");'
int(333)

Aksi takdirde PHP zayıf yazıldığında, yani genel olarak bunu yapmak gerekmez. Bu dilin ima ediyor. Örn. Bir fonksiyon bir sayısal argüman sürerse, o sayı dize, tamsayı veya tüm aynı yüzebilen; Gerekirse değeri dönüştürülür. Neden örneğin echo 33 Bu bir hata olmadan bulunuyor.

PHP kesin belirlenmiş değildir.

Bunu örtülü Conversor kullanarak otomatik olarak dönüştürmek istiyorsunuz bir bool beklediği bir işlev içine bir hbool örneğini geçmek ne zaman, gibi bir şey istiyorum.

What happens is that no function "expects" a bool, it's all dynamically typed. You can force an explicit conversion by calling (int)$something but if that's the case you can then pass $something->to_otherthing() instead for non-automatic conversions.

PS: Ben im net burada olmaktan emin değilim. Ben bir şey yemek sonra bu cevabı düzenlemek için çalışacağız :)