Edit report at https://bugs.php.net/bug.php?id=43845&edit=1
ID: 43845
Comment by: php dot net at site dot lanzz dot org
Reported by: ms419 at freezone dot co dot uk
Summary: Function can no longer be called both statically and
as instance method
Status: Open
Type: Feature/Change Request
Package: Feature/Change Request
PHP Version: 5.2.5
Block user comment: N
Private report: N
New Comment:
Since PHP does actually distinguish between static and non-static methods, it
makes no sense (as external interface) to disallow _both_ calling the same
method
as static and non-static _and_ having same-named static and non-static methods.
At run time PHP knows if you're calling a static or a non-static method, so it
can pick the correct one.
Here is an example where same-named static and non-static methods might make
sense:
class Foo {
static public function defaultInstance() {
static $instance = null;
if (is_null($instance)) {
$instance = new self();
}
}
static public function bar() {
$instance = self::defaultInstance();
return $instance->bar();
}
public function bar() {
// do something
}
}
Foo::bar() // no need to explicitly request the default instance
$f = new Foo();
$f->bar() // but now it is clear that we're doing the same thing with a
specific
instance
Previous Comments:
------------------------------------------------------------------------
[2011-08-09 03:20:10] klaussantana at gmail dot com
Actually, you must declare your method static. It will not produce any warning,
but you will cannot be able to use $this.
Instead, you must always use the first parameter.
So this will be like this:
<?php
class MyClass
{
static public function MyMethod()
{
$this = $Instance = func_get_arg(0);
if ( ! $this instanceof self )
{ throw new Exception('You must use this method with an Instance of
the
same class.'); }
/* ... your code here ... */
}
}
?>
Remember.. You will always need to pass the instance for your method to work
correctly.
Farewell.
------------------------------------------------------------------------
[2008-01-14 20:15:20] ms419 at freezone dot co dot uk
Description:
------------
I understand that, unlike some other languages, PHP does not support
overloading: I can't implement two functions with the same name but different
signatures. However I can simulate overloading using func_get_args() and
testing with which arguments the function was called.
Now what I want is a function which can be called either as an instance method
with no arguments, or statically with one argument: an instance of the class. I
test whether the function was called statically or not using isset($this)
However in PHP5, this produces an error:
Non-static method BaseTaxonomy::getTerms() should not be called statically in...
Like it is possible to simulate overloading in PHP without generating errors, I
wish it were possible to define a function which can be called either
statically or as an instance method, without generating errors.
Much thanks, Jack
Reproduce code:
---------------
Toy example:
class BaseTaxonomy
{
protected $terms = null;
public function getTerms()
{
if (!isset($this))
{
$args = func_get_args();
return $args[0]->terms;
}
return $this->terms;
}
}
Actual result:
--------------
Non-static method BaseTaxonomy::getTerms() should not be called statically in...
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=43845&edit=1