Neden PHP Kurucular aşırı değil mi?

8 Cevap php

Ben hiç PHP benim kurucular aşırı edememek ümidini kesmiş, bu yüzden ne ben gerçekten bilmek istiyorum why olduğunu var.

Bunun için bile bir nedeni var mı? Doğası gereği kötü kod oluşturmak mı? Yaygın kabul gören dil tasarım izin, ya da diğer dillerde PHP daha güzel değil mi?

8 Cevap

Sen variable arguments aynı etkiyi yaratmak için kullanabilirsiniz. Güçlü yazarak olmadan, o, verilen varsayılan argümanlar ve diğer tüm eklemek çok mantıklı değil "iş arounds."

PHP HERHANGİ yöntemi aşırı olamaz. Eğer parametrelerin farklı kombinasyonları geçerken özel bir kurucu ile fabrika desen kullanmak, bir PHP nesne örneğini oluşturmak için muktedir istiyorum.

Örneğin:

public MyClass {
    private function __construct() {
    ...
    }

    public static function makeNewWithParameterA($paramA) {
        $obj = new MyClass(); 
        // other initialization
        return $obj;
    }

    public static function makeNewWithParametersBandC($paramB, $paramC) {
        $obj = new MyClass(); 
        // other initialization
        return $obj;
    }
}

$myObject = MyClass::makeNewWithParameterA("foo");
$anotherObject = MyClass::makeNewWithParametersBandC("bar", 3);

Gerçek aşırı yükleme gerçekten PHP desteklenmiyor. @ Veba belirtildiği gibi, değişken argümanları kullanabilirsiniz. Bazı insanlar sadece bu üstesinden gelmek için çeşitli seçenekler bir ilişkisel dizi kullanın.

Ben gerçekten hiç OOP uzman değilim, ama anladığım kadarıyla overloading girdi olarak aldığı parametreleri göre farklı hareket bir yöntem yeteneği anlamına gelir. Bu çok mümkün PHP ile, sadece PHP güçlü yazmaya sahip olmadığından giriş türlerini ilan yok, ve tüm aşırı yük yerine derleme zamanı zamanında yapılır.

Bu PHP ile ilgili birçok şikayet biridir - bildiğim kadarıyla, PHP aşırı yükleme yapıcı PHP geliştiricileri bu işlevselliği içermiyordu çünkü, izin verilmez.

Ben hile ve geçici çözümler duydum, ama OOP anlamda doğru aşırı yükleme eksik. Belki gelecek sürümlerinde, bu dahil edilecektir.

You can use conditional statements in your constructor and then perform your task. Eg.

  class Example
  {
      function __construct($no_of_args)

      {// lets assume 2
          switch($no_of_args)
          {
              case 1:
                // write your code
              break;
              case 2:
                //write your 2nd set of code
              break;
              default:
           //write your default statement
         }
      }
   }

    $object1 = new Example(1);  // this will run your 1st case
    $object2 = new Example(2);  // this will run your 2nd case

ve böylece ...

Onlar bu işi ki:

<?php
class A
{
    function __construct()
    {
        $a = func_get_args();
        $i = func_num_args();
        if (method_exists($this,$f='__construct'.$i)) {
            call_user_func_array(array($this,$f),$a);
        }
    }

    function __construct1($a1)
    {
        echo('__construct with 1 param called: '.$a1.PHP_EOL);
    }

    function __construct2($a1,$a2)
    {
        echo('__construct with 2 params called: '.$a1.','.$a2.PHP_EOL);
    }

    function __construct3($a1,$a2,$a3)
    {
        echo('__construct with 3 params called: '.$a1.','.$a2.','.$a3.PHP_EOL);
    }
}
$o = new A('sheep');
$o = new A('sheep','cat');
$o = new A('sheep','cat','dog');

// results:
// __construct with 1 param called: sheep
// __construct with 2 params called: sheep,cat
// __construct with 3 params called: sheep,cat,dog
?>

and, it seem every one are happy with it, but for me it didn't work... if you get it to work, its one kind of overloading too...

tüm argoments almak ve ikincil işlevi kurucusuna onları geçmek ...

Ben de PHP aşırı yüklenme constructor potansiyel yerine constructor with default arguments kullanabilirsiniz düşünüyorum.

Yine de, gerçek yapıcı aşırı yüklenmelerin PHP desteklenmiyor gerçekten üzücü.