PHP güvenli bir sınıf redeclare için herhangi bir yolu var mı?

6 Cevap php

Hepimiz rezil "sınıfını Redeclare" hata biliyorum. Bu üstesinden gelmek ve aslında aynı adla yeni bir sınıf bildirmek için herhangi bir yöntem var mı, yoksa bu PHP 5 imkansız mı?

6 Cevap

Hayır, bildiğim kadarıyla, orada bazı karanlık uzantısını kullanarak bir yolu olabilir, ama temel standart PHP olabilir.

Ancak, her zaman varolan bir sınıfını genişletmek ve - belki, senin senaryoya göre - üzerinde çalıştığınız uygulamanın içine uzun sınıfın bir örneğini "kaçakçılık".

As Pekka and Techpriester both pointed out: no, you cannot. However, if you're using PHP >= 5.3, then you can use namespaces and the "use" construct to effectively "redeclare" the class. Here's an example:

// MyClass.php
class MyClass {
  const MY_CONST = 1;
}
// MyNamespaceMyClass.php namespace Mynamespace; class MyClass { const MY_CONST = 2; }
// example.php require_once 'MyClass.php'; require_once 'MyNamespaceMyClass.php';
use Mynamespace\MyClass as MyClass;
echo MyClass::MY_CONST; // outputs 2

Sınıfım şimdi isimalanlı sınıfa gelir olarak Böylece, sizin, istenen sonucu var.

Bu imkansızdır. Kullanım durumunda bağlı olarak, söz jpfuentes2 gibi ad alanları, sizin için işe yarayabilecek.

Bir hack bir özel yeni "operatörü" uygulamaktır.

Example:


$GLOBALS['class_map'] = array('A' => 'A');
function _new($class){
  $realClass = $GLOBALS['class_map'][$class];
  return new $realClass;
}

class A {} $a = _new('A');

// change the implementation $GLOBALS['class_map']['A'] = 'B'; $a2 = _new('A');

Başka bir hack runkit bir sınıf yeniden uygulamak için kullanmaktır.

AFAIK, çıkarken işlevleri veya sınıfları redeclaring PHP mümkün değildir.

Eğer söylemek olsaydı, ne yapmaya çalışıyorsun ne, belki başka bir çözüm var ...

Temelde bir sınıf redeclare olamaz. Eğer gerçekten istiyorsanız, yapabilirsiniz. :) Her şey mümkün. Bu yapısını değiştiren bir sınıf, ihtiyacınız dynamically? Sen sihirli yöntem __ çağrısı ve desen Devlet kullanabilirsiniz.

class Example
{
  var $state;

  public function setImplementation($state)
  {
    $this->state = $state;
  }

  public function __call($method, $args)
  {
    if (method_exists($this->state, $method))
       return $this->state->$method($args);
    else
      // error
  }

}

Dinamik sınıfları ile oynamak için bir PHP araç da vardır: http://php.net/manual/en/book.runkit.php

Ben redeclaring sınıf ve yöntemleri Ruby mümkün olduğunu biliyorum (ve bir dil tasarımında bir hata olarak düşünün).

Temelde, PHP bir sınıf redeclare olamaz directly. Eğer php bir sınıf redeclare almak ihtiyacı varsa, o zaman ayrı bir dosyada bu sınıf yazmak ve require_one İstediğiniz sayfaya bu dosyayı aramak için kullanmanızı öneririm. Aşağıdaki gibi:

Page1.php

class abcd
{
    function max()
    {
        echo "Hello World!!! count:-".$GLOBALS['x'];
    }
}

Page2.php

$i=10; 
for($x=0;$x<$i;$x++)
{
      require_once "Page1.php";
      $myclass = new abcd();
      $myclass->max();
}

Now it will work as you desired. Bu me için çalıştı.

Aşağıdaki gibi çıkış olacaktır:

 Hello World!!! count:- 0

 Hello World!!! count:- 1

 Hello World!!! count:- 2

 Hello World!!! count:- 3

 Hello World!!! count:- 4

 Hello World!!! count:- 5

 Hello World!!! count:- 6

 Hello World!!! count:- 7

 Hello World!!! count:- 8

 Hello World!!! count:- 9