Monday, 25 September 2017

php - When to use self over $this?



In PHP 5, what is the difference between using self and $this?




When is each appropriate?


Answer






Use $this to refer to the current
object. Use self to refer to the
current class. In other words, use
$this->member for non-static members,

use self::$member for static members.






Here is an example of correct usage of $this and self for non-static and static member variables:



class X {
private $non_static_member = 1;

private static $static_member = 2;

function __construct() {
echo $this->non_static_member . ' '
. self::$static_member;
}
}

new X();
?>



Here is an example of incorrect usage of $this and self for non-static and static member variables:



class X {
private $non_static_member = 1;
private static $static_member = 2;

function __construct() {

echo self::$non_static_member . ' '
. $this->static_member;
}
}

new X();
?>


Here is an example of polymorphism with $this for member functions:




class X {
function foo() {
echo 'X::foo()';
}

function bar() {
$this->foo();
}

}

class Y extends X {
function foo() {
echo 'Y::foo()';
}
}

$x = new Y();
$x->bar();

?>


Here is an example of suppressing polymorphic behaviour by using self for member functions:



class X {
function foo() {
echo 'X::foo()';
}


function bar() {
self::foo();
}
}

class Y extends X {
function foo() {
echo 'Y::foo()';
}

}

$x = new Y();
$x->bar();
?>



The idea is that $this->foo() calls the foo() member function of whatever is the exact type of the current object. If the object is of type X, it thus calls X::foo(). If the object is of type Y, it calls Y::foo(). But with self::foo(), X::foo() is always called.





From http://www.phpbuilder.com/board/showthread.php?t=10354489:



By http://board.phpbuilder.com/member.php?145249-laserlight


No comments:

Post a Comment

casting - Why wasn't Tobey Maguire in The Amazing Spider-Man? - Movies & TV

In the Spider-Man franchise, Tobey Maguire is an outstanding performer as a Spider-Man and also reprised his role in the sequels Spider-Man...