Whilst looking at overloading in PHP before ("Looking at PHP's OOP from a CFMLer's perspective: overloading (which is not what you'd assume it is)"), I thought I might need to write an equivalent on
onMissingMethod(), to catch instances of me calling... methods which I expected not to exist. I didn't need to because PHP works differently form how I expected it to, but it piqued my interest so I've just looked up how this is done. It's easy.Here's a CFML example:
// Missing.cfc
component {
    public function onMissingMethod(name, args) {
        writeDump(arguments);
    }
}
// missing.cfm
missing = new Missing();
missing.nonExistent("first",["second"]);
Nothing out of the ordinary there. It outputs:
| Scope Arguments | |||||||||||||||||||||
| name | 1 | 
 | |||||||||||||||||||
| args | 2 | 
 | |||||||||||||||||||
So the first argument is the function that was called (and does not exist), and the second are the arguments passed to it.
Very similarly, here's the PHP equivalent:
<?php
// Missing.class.php
class Missing
{
    public function __call($name, $arguments)
    {
        require "../../../debug/dBug.php";
        new dBug(func_get_args());
    }
}
<?php
// missing.php
require "Missing.class.php";
$missing = new Missing();
$missing->nonExistent("first", ["second"]);
| func_get_args() (array) | |||||||||||
| 0 | nonExistent | ||||||||||
| 1 | 
 | ||||||||||
So
__call() is the PHP equivalent of onMissingMethod(), and works pretty much the same way.PHP also has the notion of static methods, and there's a handler for missing static methods too. Here's a variation of the above code... the difference is basically we use
__callStatic() instead:<?php
// Missing.class.php
require "../../../debug/dBug.php";
class Missing
{
    public function __call($name, $arguments)
    {
        echo sprintf("Function called: %s", __FUNCTION__);
        new dBug(func_get_args());
    }
    public static function __callStatic($name, $arguments)
    {
        echo sprintf("Function called: %s", __FUNCTION__);
        new dBug(func_get_args());
    }
}
<?php
// missing.php
require "Missing.class.php";
$missing = new Missing();
$missing->nonExistent("first", ["second"]);
echo "<hr>";
Missing::nonExistent("tuatahi", ["tuarua"]);
Function called: __call
| func_get_args() (array) | |||||||||||
| 0 | nonExistent | ||||||||||
| 1 | 
 | ||||||||||
Function called: __callStatic
| func_get_args() (array) | |||||||||||
| 0 | nonExistent | ||||||||||
| 1 | 
 | ||||||||||
So that's straight forward too.
I realise there's not much insight to this article, but I just wanted to share when things go smoothly as well as when I get undone by weirdness / ignorance.
--
Adam
