ACC SHELL
<?php
/**
* This file is part of the Nette Framework (http://nette.org)
* Copyright (c) 2004 David Grudl (http://davidgrudl.com)
* @package Nette
*/
/**
* PHP callback encapsulation.
*
* @author David Grudl
* @property-read bool $callable
* @property-read string|array|Closure $native
* @property-read bool $static
* @package Nette
*/
class NCallback extends NObject
{
/** @var callable */
private $cb;
/**
* Factory. Workaround for missing (new Callback)->invoke() in PHP 5.3.
* @param mixed class, object, callable
* @param string method
* @return NCallback
*/
public static function create($callback, $m = NULL)
{
return new self($callback, $m);
}
/**
* @param mixed class, object, callable
* @param string method
*/
public function __construct($cb, $m = NULL)
{
if ($m !== NULL) {
$cb = array($cb, $m);
} elseif ($cb instanceof self) { // prevents wrapping itself
$this->cb = $cb->cb;
return;
}
if (PHP_VERSION_ID < 50202 && is_string($cb) && strpos($cb, '::')) {
$cb = explode('::', $cb, 2);
} elseif (is_object($cb) && !$cb instanceof NClosure) {
$cb = array($cb, '__invoke');
}
// remove class namespace
if (is_string($this->cb) && $a = strrpos($this->cb, '\\')) {
$this->cb = substr($this->cb, $a + 1);
} elseif (is_array($this->cb) && is_string($this->cb[0]) && $a = strrpos($this->cb[0], '\\')) {
$this->cb[0] = substr($this->cb[0], $a + 1);
}
if (!is_callable($cb, TRUE)) {
throw new InvalidArgumentException("Invalid callback.");
}
$this->cb = $cb;
}
/**
* Invokes callback. Do not call directly.
* @return mixed
*/
public function __invoke()
{
if (!is_callable($this->cb)) {
throw new InvalidStateException("Callback '$this' is not callable.");
}
$_args=func_get_args(); return call_user_func_array($this->cb, $_args);
}
/**
* Invokes callback.
* @return mixed
*/
public function invoke()
{
if (!is_callable($this->cb)) {
throw new InvalidStateException("Callback '$this' is not callable.");
}
$_args=func_get_args(); return call_user_func_array($this->cb, $_args);
}
/**
* Invokes callback with an array of parameters.
* @param array
* @return mixed
*/
public function invokeArgs(array $args)
{
if (!is_callable($this->cb)) {
throw new InvalidStateException("Callback '$this' is not callable.");
}
return call_user_func_array($this->cb, $args);
}
/**
* Verifies that callback can be called.
* @return bool
*/
public function isCallable()
{
return is_callable($this->cb);
}
/**
* Returns PHP callback pseudotype.
* @return string|array|Closure
*/
public function getNative()
{
return $this->cb;
}
/**
* Returns callback reflection.
* @return NFunctionReflection|NMethodReflection
*/
public function toReflection()
{
if (is_string($this->cb) && strpos($this->cb, '::')) {
return new NMethodReflection($this->cb);
} elseif (is_array($this->cb)) {
return new NMethodReflection($this->cb[0], $this->cb[1]);
} elseif (is_object($this->cb) && !$this->cb instanceof Closure) {
return new NMethodReflection($this->cb, '__invoke');
} else {
return new NFunctionReflection($this->cb);
}
}
/**
* @return bool
*/
public function isStatic()
{
return is_array($this->cb) ? is_string($this->cb[0]) : is_string($this->cb);
}
/**
* @return string
*/
public function __toString()
{
if ($this->cb instanceof Closure) {
return '{closure}';
} elseif (is_string($this->cb) && $this->cb[0] === "\0") {
return '{lambda}';
} else {
is_callable($this->cb, TRUE, $textual);
return $textual;
}
}
}
ACC SHELL 2018