2016-05-03 3 views
2

В javascript я знаю, что можно просто переопределить класс-метод одного экземпляра, но я не совсем уверен, как это управляется в PHP. Вот моя первая мысль:Функция переопределения PHP одного экземпляра

class Test { 
    public $var = "placeholder"; 
    public function testFunc() { 
     echo "test"; 
    } 
} 

$a = new Test(); 

$a->testFunc = function() { 
    $this->var = "overridden"; 
}; 

Моей вторая попытка была звонки анонимных функций, которые, к сожалению, убивает объекта объема ...

class Test { 
    public $var = "placeholder"; 
    public $testFunc = null; 
    public function callAnonymTestFunc() { 
     $this->testFunc(); 
    } 
} 

$a = new Test(); 

$a->testFunc = function() { 
    //here the object scope is gone... $this->var is not recognized anymore 
    $this->var = "overridden"; 
}; 

$a->callAnonymTestFunc(); 
+0

Я не уверен, почему вы хотели бы это сделать. Только для того, чтобы установить свойство? Или есть другие функции? –

+2

Вы хотите переопределить уровень класса или объекта? Если на уровне класса вы можете просто расширить свой класс и переопределить функцию таким образом. Если на уровне объекта вы можете передать обратный вызов конструктору. – Schore

+0

было бы на уровне объекта, можете ли вы объяснить, что вы подразумеваете под «вы могли бы передать обратный вызов конструктору»? Заранее спасибо! – marius

ответ

2

Чтобы полностью понять, чего вы пытаетесь достичь, re, ваша желаемая версия PHP должна быть известна первой, PHP 7 более идеален для подходов OOP, чем любая предыдущая версия.

Если проблема связана с вашей анонимной функцией, вы можете указать bind the scope of a function с PHP> = 5.4 экземпляру, например.

$a->testFunc = Closure::bind(function() { 
    // here the object scope was gone... 
    $this->var = "overridden"; 
}, $a); 

В РНР> = 7, вы можете вызвать bindTo сразу на созданном Closure

$a->testFunc = (function() { 
    // here the object scope was gone... 
    $this->var = "overridden"; 
})->bindTo($a); 

Хотя ваш подход, что вы пытаетесь достичь, это за пределами моего воображения. Может быть, вы должны попытаться прояснить свою цель, и я разберу все возможные решения.

+0

thx это было о привязке сферы, отлично работало, спасибо! – marius

-2

Я хотел бы использовать принцип наследования ООП, который работает в большинство языков высокого уровня:

Class TestOverride extends Test { 
public function callAnonymTestFunc() { 
//overriden stuff 
} 
} 

$testOverriden = new TestOverriden(); 
$testOverriden->callAnonymTestFunc(); 
Смежные вопросы