PHP, bu sınıfın kurucu çağırmadan bir sınıfın örneğini oluşturmak mümkün mü?

5 Cevap php

Herhangi bir yolla, onun kurucu çağırmadan bir php sınıfının bir örneğini oluşturmak mümkün mü?

I Sınıf A var ve bunun bir örneğini oluştururken dosya geçirerek ve A sınıfı yapıcısı dosyayı açıyorum.

Şimdi A sınıfı, ben aramam lazım ama dosyayı geçmek için gerekli değilim fonksiyonu var ve bu yüzden dosyayı geçirerek değilim olarak dosyanın açılması yapıcı işlevini kullanmak gerek yoktur.

Yani benim soru, onun kurucu çağırmadan, bir PHP sınıfının bir örneğini oluşturmak için herhangi bir şekilde mümkün mü?

Fonksiyonunda sınıf özellikleri bazı kullanıyorum gibi Note Ben işlevi statik yapamazsınız.

5 Cevap

A sınıfları kurucu her zaman çağrılır. Eğer olsa, bu işe yarayabilir bir kaç yolu vardır.

Birinci yol kurucudaki sizin parametreler için varsayılan değerler sağlamak, ve onlar set eğer sadece bu parametreler belirli eylemleri gerçekleştirmek için. Örneğin:

class MyClass {
    public __construct($file = null) {
        if ($file) {
            // perform whatever actions need to be done when $file IS set
        } else {
            // perform whatever actions need to be done when $file IS NOT set
        }
        // perform whatever actions need to be done regardless of $file being set
    }
}

Başka bir seçenek Çocuk sınıfın yapıcısı üst sınıfın kurucusunu çağırmak olmadığını sınıf böyle uzatmaktır.

class MyParentClass {
    public __construct($file) {
        // perform whatever actions need to be done regardless of $file being set
    }
}

class MyChildClass extends MyParentClass {
    public __construct() {
        // perform whatever actions need to be done when $file IS NOT set
    }
}

Bu gerçekten mümkündür.

PHPUnit_Framework_MockObject_Generator Modifiye

1  $myClass = unserialize(
2      sprintf(
3          'O:%d:"%s":0:{}',
4          strlen('MyClass'), 'MyClass'
5      )
6  );

Lütfen unutmayın, bu gibi bir kod PHPUnit böyle bir çerçeve içinde tüm iyi ve haklı. Eğer üretim kodunda bu gibi bir kod olması varsa Ama, büyük olasılıkla çok garip bir şey yapıyorsun.


Eğer bir açıklama istedi beri:

Eğer serialize an Object Eğer nesne bir dize temsilini olsun. Örneğin

echo serialize(new StdClass) // gives O:8:"stdClass":0:{}

O nesne anlamına gelmektedir. 8 sınıf adının dize uzunluğudur. "stdClass" sınıf adı açıkçası. Serileştirilmiş nesne 0 set özellikleri (more to that later), boş kaşlı ayraçlar ile gösterilir vardır. : sadece sınırlayıcılardır.

Her tefrika dize unserialize fonksiyonu ile orijinal "canlı" bir değer haline yeniden olabilir. Aksi takdirde, kurucu aşmak olacaktır. Charles doğru işaret gibi) seri hale getirilirken magic method __wakeup() will be called if it is defined (just like __sleep() çağrılır.

Hat 3 size sprintf (hat 2) ile kullanılmak üzere hazırlanmış bir dize bakın. Eğer sınıf adının dize uzunluğu %d olarak verilir ve sınıf adı %s olarak verilir görebilirsiniz. Bu bir rakam ve bir dizge olarak, ikinci olarak 4. satırda kendisine geçirilen ilk argümanı kullanmak gerekir sprintf'i anlatmaktır. Bu nedenle, sprintf aramanın sonucudur

'O:7:"MyClass":0:{}'

Eğer denetleyici yürütmesini olmadan örneğini istediğiniz sınıfın tefrika dize oluşturmak için istediğiniz sınıf adı ile 4. satırda "Sınıfım" hem tekrarlarını yerini alacak.

Bu dize daha sonra kurucu atlayarak, satır 1'de bir Sınıfım örneğine dizgilenmemiş edilir. Dizgilenmemiş örneği, tüm bu sınıfının yöntemlerini ve aynı zamanda herhangi bir özelliğe sahip olacaktır. Sınıfım de özellikleri var ise tefrika kukla dize farklı değerler eklemek sürece, bu, varsayılan değerlere sahip olacaktır.

Ve zaten bu. Bu konuda çok büyülü bir şey.

Senin durumunda bu yüzden böyle bir şeyler yapmak gerekmez, ama soru cevap için kodunuzu yeniden tasarlama düşünmeye tavsiye ederim: yes, it is possible.

Sen ReflectionClass kullanabilir ve newInstanceWithoutConstructor tanıtıldı yöntem PHP 5.4 Sonra onun kurucu çağırmadan bir sınıfın örneğini oluşturmak için çok kolay:

$reflection = new ReflectionClass("ClassName");
$instance = $reflection->newInstanceWithoutConstructor(); //That's it!

Wouldn't it be better to make the function you need static - alter class A so that it has another constructor that doesn't take any aruguments


Bir sınıf statik yapılabilir bir sınıfta olmayan statik özellikleri veya işlevlerinin herhangi erişmek olmayan bir fonksiyonu varsa.

class A{
    public function __construct($arg1){
    }

    public static function foo(){
        //do something that doesn't involve the class properties
    }
}

Daha sonra sınıfı oluşturmak zorunda kalmadan çağrılabilir

//the constructor will not be called as we haven't created an instance of A
A::foo();

Statik ve hiçbiri statik işlevi arasındaki fark statik işlev de statik işlevlerinin sınıf özelliklerine erişemiyor olmasıdır. Yani eğer foo() Eğer $this-> bunu statik yapamazsınız kullanan herhangi bir kodu var.

Eğer yöntem statik yapmak ve bağlam nesne sınıfı bağlamında onu aramak ve olamazdı.

kodunda bu gibi görünecektir:

class A {
  public static function func($txt) {
    print($txt);
  }
}

A::func('test');