Wednesday, 17 September 2014

PHP equivalence: getFunctionCalledName()

G'day:
I touched on this in the last article: "Looking at PHP's OOP from a CFMLer's perspective: overloading (which is not what you'd assume it is)". PHP has a magic constant __FUNCTION__ which returns the name of the function being called. I claimed it's kinda like getFunctionCalledName() in CFML. But not quite. Let's have a look.

(This will be a pretty short article, I think).

CFML: getFunctionCalledName()

As a recap, here's some CFML code demonstrating getFunctionCalledName():

// getFunctionCalledName.cfm

function f(){
    echo("#getFunctionCalledName()#() called<br>");
}

f();
echo("<hr>");

g = f;
g();

This outputs:

F() called

G() called

Note that despite the function being declared as f(), getFunctionCalledName() "knows" the latter call to it was via the reference g. OK. That's the baseline expectation set.

PHP equivalent: __function__?

(Betteridge alert!)

Here's the equivalent PHP code using __function__:

<?php
// testFunction.php

function f()
{
    echo sprintf("Using __FUNCTION__: %s() called<br>", __FUNCTION__);
}

f();
echo "<hr>";

$g = "f";
$g();

And this outputs:

Using __FUNCTION__: f() called

Using __FUNCTION__: f() called

Hmmm. So __FUNCTION__ always returns the function with its defined name.

On a whim, let's see what happens with a function expression:

<?php
// testFunctionExpression.php

$f = function () {
    echo sprintf("Using __FUNCTION__: %s() called<br>", __FUNCTION__);
};

$f();
echo "<hr>";

$g = $f;
$g();


Result:

Using __FUNCTION__: {closure}() called

Using __FUNCTION__: {closure}() called

"closure". Harrumph. But anyway, that's along the lines of what I expected. Pleasingly, the syntax for a function expression is the same as CFML, so I was able to correctly guess that. Win.

debug_backtrace()?

So how do we find the actual name the function was called with?

Googling about I found a lot of references to debug_backtrace(), which is worth looking at:

<?php
// debugBackTraceDump.php

require "../../debug/dBug.php";

function f()
{
    new dBug(debug_backtrace());
}

f();
echo "<hr>";

$g = "f";
$g();

Result:

debug_backtrace() (array)
0
array
fileD:\Websites\www.scribble.local\shared\scratch\php\www\experiment\constants\debugBackTraceDump.php
line11
functionf
args
array

debug_backtrace() (array)
0
array
fileD:\Websites\www.scribble.local\shared\scratch\php\www\experiment\constants\debugBackTraceDump.php
line15
functionf
args
array

Well it's handy to know about debug_backtrace(), but it's no help to us here.

Nope

More googling... and I've drawn a blank.

Maybe I have to pop my head above the parapet on Stack Overflow and ask a question? Shudder. Done: "PHP: Get the name a function was called as, equivalent to CFML's getFunctionCalledName()".

--
Adam