Переменные переменные расширения класса в PHP - действительно ли это возможно?

Вы должны импортировать свои настройки с помощью from django.conf import settings

5
задан Darryl Hein 20 November 2008 в 16:48
поделиться

5 ответов

Вы принимаете здесь php, выполняется от начала до конца, но это не вполне работает как этот:

<?php
foo();  # works

function foo(){
  print "bar";
}

<?php

foo();  #dies

if( $i == 1 )
{
  function foo(){
    print "bar";
  }
}

<?php
$i = 1;
if( $i == 1 )
{
  function foo(){
    print "bar";
  }
}

foo(); #works

Теперь, хотя можно условно создать классы:

<?php

class A { }
class B { }
if( false ){ 
  class C extends B { 
    public static function bar(){
      print "baz"; 
    }
  }
}
C::bar(); # dies

Вы наклоняетесь, инстанцируют один во времени выполнения от переменной:

<?php
class A { }
class B { }
$x = 'B'; 
if( false ){ 
  class C extends $x { 
    public static function bar(){
      print "baz"; 
    }
  }
}
C::bar();
---> Parse error: syntax error, unexpected T_VARIABLE, expecting T_STRING in /tmp/eg.php on line 7

Существует способ сделать это с Оценкой, но Вы действительно не хотите идти туда:

<?php

class A { }
class B { }
$x = 'B'; 
if( true ){ 
 $code =<<<EOF
  class C extends $x { 
    public static function bar(){
      print "baz"; 
    }
  }
EOF;

  eval( $code );
}
C::bar();
$o = new C; 
if ( $o instanceof $x )
{
  print "WIN!\n";
}
--->barWIN!

Однако здесь существует более важный вопрос:

Какого черта был бы Вы хотеть расширить другой класс во времени выполнения

Кто-либо использующий Ваш код захочет удержать Вас и хлестать Вас для этого.

(С другой стороны, если Вы в бросание, сделайте тот прием оценки),

15
ответ дан 18 December 2019 в 06:52
поделиться

Я не вижу, как это было бы особенно полезно, но отвечать на Ваш вопрос... нет. Нет никакого способа динамично сделать это, потому что сгенерированный класс нужно инстанцировать, прежде чем переменная оценена (если это имеет смысл).

Помещать его просто: класс должен существовать, прежде чем код может быть правильно выполнен.

2
ответ дан 18 December 2019 в 06:52
поделиться

Если у Вас нет слишком многих значений за $blah, Вы могли бы расширить каждого в различном файле затем require_once "classes/foo_$blah.php"

Иначе Вы застреваете с eval() решение... удача с этим... :)

2
ответ дан 18 December 2019 в 06:52
поделиться

Я предполагаю, что это для простоты, правильно? Расширение класса во время выполнения действительно является довольно сумасшедшим.

class SuperClassOne { /* code */ }
class SuperClassTwo { /* code */ }

class IntermediateClass extends SuperClassOne { /* empty! */ }

class DescendantClassFoo extends IntermediateClass{ }
class DescendantClassBar extends IntermediateClass{ }
class DescendantClassBaz extends IntermediateClass{ }

Затем когда Вы хотите изменить все Ваш DescendantClass* классы, просто необходимо изменить то, что расширяет IntermediateClass:

class IntermediateClass extends SuperClassTwo { }
2
ответ дан 18 December 2019 в 06:52
поделиться

вы должны были попробовать $$

$blah = 'foo1';
class foo2 extends $$blah {
    //...
}

class foo1 {
    //...
}
-2
ответ дан 18 December 2019 в 06:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: