создать динамический метод класса в php - PullRequest
0 голосов
/ 01 октября 2018

Я хотел бы создать динамический метод в классе.

Я пытался сделать это:

class abc
{
   public $function_prefix;

   function __construct() {
          $prefix = new ups_generic_name();
          $function_prefix = $prefix->class_prefix.'_shipping_array';
   }        

   function $this->function_prefix( $packages ) 
   {
   }
}

Но это вызывает ошибку.

1 Ответ

0 голосов
/ 01 октября 2018

ПРИМЕЧАНИЕ. То, что вы предлагаете, является плохой идеей! За почти 15 лет разработки PHP я никогда не сталкивался с проблемой, которую можно решить, только динамически добавляя методы в класс или дажегде это было бы лучшим решением, и этот вид магии приведет только к путанице позже, когда какой-то бедняга должен вернуться и исправить или исправить то, что вы сделали.Тот факт, что вы думаете, что вам нужно сделать это большой красный флаг, что в вашем дизайне есть что-то принципиально неправильное, и вы должны пересмотреть это.

Также обратите внимание, что я на самом деле не проверял это.

Если вы добавите анонимный метод в класс и реализуете магический метод __ call , тогда вы сможете создать что-то похожее на то, что вы пытаетесь реализовать.

class ScaryClass
{
    public function __call($method, array $args)
    {
        call_user_func_array($this->$method, $args);
    }
}

$scaryInstance = new ScaryClass;
$scaryInstance->scaryMethod = function($argument) 
{
    echo $argument;
}

$scaryInstance->scaryMethod("This code is really scary and I feel like a terrible person for having even written it");

Однако у этого есть множество проблем, самая большая из которых заключается в том, что анонимная функция не имеет представления о контексте, в котором она вызывается, и поэтому вы не можете использовать $ this или делать какие-либо предположения относительнохостинг класс вообще.Это делает этот трюк практически бесполезным на практике.

Так что TL: DR, да, вы можете это сделать (вроде), но это не будет работать очень хорошо, это будет очень запутанно, и в этом нет никакой пользы и огромное количество недостатков.Теперь вы знаете, как это сделать, не делайте этого .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...