Php invoke method in class

Php invoke method in class

Callbacks can be denoted by the callable type declaration.

Some functions like call_user_func() or usort() accept user-defined callback functions as a parameter. Callback functions can not only be simple functions, but also object methods, including static class methods.

Passing

A PHP function is passed by its name as a string . Any built-in or user-defined function can be used, except language constructs such as: array() , echo , empty() , eval() , exit() , isset() , list() , print or unset() .

A method of an instantiated object is passed as an array containing an object at index 0 and the method name at index 1. Accessing protected and private methods from within a class is allowed.

Static class methods can also be passed without instantiating an object of that class by either, passing the class name instead of an object at index 0, or passing ‘ClassName::methodName’ .

Apart from common user-defined function, anonymous functions and arrow functions can also be passed to a callback parameter.

Note:

As of PHP 8.1.0, anonymous functions can also be created using the first class callable syntax.

Generally, any object implementing __invoke() can also be passed to a callback parameter.

Example #1 Callback function examples

// An example callback function
function my_callback_function () echo ‘hello world!’ ;
>

// An example callback method
class MyClass static function myCallbackMethod () echo ‘Hello World!’ ;
>
>

// Type 1: Simple callback
call_user_func ( ‘my_callback_function’ );

// Type 2: Static class method call
call_user_func (array( ‘MyClass’ , ‘myCallbackMethod’ ));

// Type 3: Object method call
$obj = new MyClass ();
call_user_func (array( $obj , ‘myCallbackMethod’ ));

// Type 4: Static class method call
call_user_func ( ‘MyClass::myCallbackMethod’ );

// Type 5: Relative static class method call
class A public static function who () echo «A\n» ;
>
>

class B extends A public static function who () echo «B\n» ;
>
>

call_user_func (array( ‘B’ , ‘parent::who’ )); // A, deprecated as of PHP 8.2.0

// Type 6: Objects implementing __invoke can be used as callables
class C public function __invoke ( $name ) echo ‘Hello ‘ , $name , «\n» ;
>
>

$c = new C ();
call_user_func ( $c , ‘PHP!’ );
?>

Example #2 Callback example using a Closure

// This is our range of numbers
$numbers = range ( 1 , 5 );

// Use the closure as a callback here to
// double the size of each element in our
// range
$new_numbers = array_map ( $double , $numbers );

print implode ( ‘ ‘ , $new_numbers );
?>

The above example will output:

Note:

Callbacks registered with functions such as call_user_func() and call_user_func_array() will not be called if there is an uncaught exception thrown in a previous callback.

User Contributed Notes 19 notes

You can also use the $this variable to specify a callback:

public $property = ‘Hello World!’ ;

public function MyMethod ()
<
call_user_func (array( $this , ‘myCallbackMethod’ ));
>

public function MyCallbackMethod ()
<
echo $this -> property ;
>

Performance note: The callable type hint, like is_callable(), will trigger an autoload of the class if the value looks like a static method callback.

When specifying a call back in array notation (ie. array($this, «myfunc») ) the method can be private if called from inside the class, but if you call it from outside you’ll get a warning:

class mc <
public function go (array $arr ) <
array_walk ( $arr , array( $this , «walkIt» ));
>

private function walkIt ( $val ) <
echo $val . «
» ;
>

public function export () <
return array( $this , ‘walkIt’ );
>
>

$m = new mc ;
$m -> go ( $data ); // valid

array_walk ( $data , $m -> export ()); // will generate warning

?>

Output:
1
2
3
4

Warning: array_walk() expects parameter 2 to be a valid callback, cannot access private method mc::walkIt() in /in/tfh7f on line 22

A note on differences when calling callbacks as «variable functions» without the use of call_user_func() (e.g. » «):

— Using the name of a function as string has worked since at least 4.3.0
— Calling anonymous functions and invokable objects has worked since 5.3.0
— Using the array structure [$object, ‘method’] has worked since 5.4.0

Note, however, that the following are not supported when calling callbacks as variable functions, even though they are supported by call_user_func():

— Calling static class methods via strings such as ‘foo::doStuff’
— Calling parent method using the [$object, ‘parent::method’] array structure

All of these cases are correctly recognized as callbacks by the ‘callable’ type hint, however. Thus, the following code will produce an error «Fatal error: Call to undefined function foo::doStuff() in /tmp/code.php on line 4»:

class foo static function callIt (callable $callback ) $callback ();
>

static function doStuff () echo «Hello World!» ;
>
>

foo :: callIt ( ‘foo::doStuff’ );
?>

The code would work fine, if we replaced the ‘$callback()’ with ‘call_user_func($callback)’ or if we used the array [‘foo’, ‘doStuff’] as the callback instead.

You can use ‘self::methodName’ as a callable, but this is dangerous. Consider this example:

class Foo public static function doAwesomeThings () FunctionCaller :: callIt ( ‘self::someAwesomeMethod’ );
>

public static function someAwesomeMethod () // fantastic code goes here.
>
>

class FunctionCaller public static function callIt (callable $func ) call_user_func ( $func );
>
>

Foo :: doAwesomeThings ();
?>

This results in an error:
Warning: class ‘FunctionCaller’ does not have a method ‘someAwesomeMethod’.

For this reason you should always use the full class name:
FunctionCaller :: callIt ( ‘Foo::someAwesomeMethod’ );
?>

I believe this is because there is no way for FunctionCaller to know that the string ‘self’ at one point referred to to `Foo`.

> As of PHP 5.2.3, it is also possible to pass ‘ClassName::methodName’

You can also use ‘self::methodName’. This works in PHP 5.2.12 for me.

I needed a function that would determine the type of callable being passed, and, eventually,
normalized it to some extent. Here’s what I came up with:

/**
* The callable types and normalizations are given in the table below:
*
* Callable | Normalization | Type
* ———————————+———————————+—————
* function (. ) use (. ) <. >| function (. ) use (. ) <. >| ‘closure’
* $object | $object | ‘invocable’
* «function» | «function» | ‘function’
* «class::method» | [«class», «method»] | ‘static’
* [«class», «parent::method»] | [«parent of class», «method»] | ‘static’
* [«class», «self::method»] | [«class», «method»] | ‘static’
* [«class», «method»] | [«class», «method»] | ‘static’
* [$object, «parent::method»] | [$object, «parent::method»] | ‘object’
* [$object, «self::method»] | [$object, «method»] | ‘object’
* [$object, «method»] | [$object, «method»] | ‘object’
* ———————————+———————————+—————
* other callable | idem | ‘unknown’
* ———————————+———————————+—————
* not a callable | null | false
*
* If the «strict» parameter is set to true, additional checks are
* performed, in particular:
* — when a callable string of the form «class::method» or a callable array
* of the form [«class», «method»] is given, the method must be a static one,
* — when a callable array of the form [$object, «method»] is given, the
* method must be a non-static one.
*
*/
function callableType ( $callable , $strict = true , callable& $norm = null ) if (! is_callable ( $callable )) switch ( true ) case is_object ( $callable ):
$norm = $callable ;
return ‘Closure’ === get_class ( $callable ) ? ‘closure’ : ‘invocable’ ;
case is_string ( $callable ):
$m = null ;
if ( preg_match ( ‘~^(?[a-z_][a-z0-9_]*)::(?[a-z_][a-z0-9_]*)$~i’ , $callable , $m )) list( $left , $right ) = [ $m [ ‘class’ ], $m [ ‘method’ ]];
if (! $strict || (new \ ReflectionMethod ( $left , $right ))-> isStatic ()) $norm = [ $left , $right ];
return ‘static’ ;
>
> else $norm = $callable ;
return ‘function’ ;
>
break;
case is_array ( $callable ):
$m = null ;
if ( preg_match ( ‘~^(:?(?self|parent)::)?(?[a-z_][a-z0-9_]*)$~i’ , $callable [ 1 ], $m )) if ( is_string ( $callable [ 0 ])) if ( ‘parent’ === strtolower ( $m [ ‘reference’ ])) list( $left , $right ) = [ get_parent_class ( $callable [ 0 ]), $m [ ‘method’ ]];
> else list( $left , $right ) = [ $callable [ 0 ], $m [ ‘method’ ]];
>
if (! $strict || (new \ ReflectionMethod ( $left , $right ))-> isStatic ()) $norm = [ $left , $right ];
return ‘static’ ;
>
> else if ( ‘self’ === strtolower ( $m [ ‘reference’ ])) list( $left , $right ) = [ $callable [ 0 ], $m [ ‘method’ ]];
> else list( $left , $right ) = $callable ;
>
if (! $strict || !(new \ ReflectionMethod ( $left , $right ))-> isStatic ()) $norm = [ $left , $right ];
return ‘object’ ;
>
>
>
break;
>
$norm = $callable ;
return ‘unknown’ ;
>
$norm = null ;
return false ;
>

?>

Hope someone else finds it useful.

Источник

How to Dynamically Invoke a Class Method in PHP?

In PHP there are various ways in which you can dynamically invoke a static or non-static method. To learn about them, let’s suppose we have the following variables; one referencing a class name, another an instantiated object, and a static and non-static method name:

$className = ClassName::class; $obj = new ClassName(); $nonStaticMethod = 'nonStaticMethod'; $staticMethod = 'staticMethod';

To dynamically invoke the methods you can do any of the following:

Using the Variable Function Syntax

You can use the variable function syntax with class methods in the following ways:

Dynamically Invoking a Non-Static Method:

You can use the method name variable directly on the object instance variable similar to how you normally would without a variable method name. For example:

// PHP 5.5+ $obj->$nonStaticMethod(); // or $obj->();

Dynamically Invoking a Static Method:

If you have both, the class name (or the object instance) and the method name as a variable, then you could dynamically invoke the static method in the following way:

// PHP 5.5+ $className::$staticMethod();

If only the class name or object instance exists as a variable, you could directly write the method name in a single, combined string (which you could then invoke as a callable ) like so:

// PHP 7+ $callable = "::staticMethod"; $callable();

You could also inline this callable string in the following way:

Since the callable string syntax returns a callable , you could also pass it as the first argument to either call_user_func() or call_user_func_array() function, for example, like so:

$callable = $obj::$staticMethod(); // or // $callable = $className::$staticMethod(); call_user_func($callable, $arg1, $arg2, . ); call_user_func_array($callable, [$arg1, $arg2, . ]);

Using the Callable Array Syntax

You can use the callable array syntax, where you specify the object instance or class name at index 0 and the method name at index 1 (regardless of whether it’s a static method or a non-static one). For example:

// PHP 5.5+ $callable = [$obj, $nonStaticMethod]; $callable();
// PHP 5.5+ $callable = [$obj, $staticMethod]; $callable();
// PHP 5.5+ $callable = [$className, $staticMethod]; $callable();

You could also inline the whole call in the following way:

([$obj, $nonStaticMethod])(); ([$obj, $staticMethod])(); // .

Since the callable array syntax returns a callable , you could also pass it as the first argument to either call_user_func() or call_user_func_array() function, for example, like so:

$callable = [$obj, $nonStaticMethod]; call_user_func($callable, $arg1, $arg2, . ); call_user_func_array($callable, [$arg1, $arg2, . ]);

It works the same way for both static and non-static methods.

Hope you found this post useful. It was published 30 Aug, 2015 (and was last revised 07 Apr, 2021 ). Please show your love and support by sharing this post.

Источник

Читайте также:  Script bootstrap min css
Оцените статью