- in_array: documentation ( source)
<?php
trait Delegator {
private $delegates = [];
protected function delegate($object, array $methods) {
// check against duplicate methods
$this->delegates[] = ['object' => $object, 'methods' => $methods];
}
function __call($method, array $args) {
foreach ($this->delegates as $delegate) {
if (in_array($method, $delegate['methods'])) {
return call_user_func_array([$delegate['object'], $method], $args);
}
}
throw new Exception('Method not found!');
}
}
class AuthService {
function authenticate($username, $password) {
echo 'Doing the auth for ' . $username . '!';
}
}
class UserModel {
use Delegator;
function __construct(AuthService $auth) {
$this->delegate($auth, ['authenticate']);
}
}
$auth = new AuthService();
$model = new UserModel($auth);
$model->authenticate('test', 'password');