PHP OOP - swkim0128/PARA GitHub Wiki
ìì(inheritance)ìŽë Ʞ졎ì íŽëì€ì êž°ë¥ì ì¶ê°íê±°ë ì¬ì ìíì¬ ìë¡ìŽ íŽëì€ë¥Œ ë§ëë ê²ì ì믞í©ëë€.
ìŽë¬í ììì 캡ìí, ì¶ìíì ëë¶ìŽ ê°ì²Ž ì§í¥ íë¡ê·žëë°ì 구ì±íë ì€ìí í¹ì§ ì€ íëì
ëë€.
ììì ìŽì©í멎 Ʞ졎ì ì ìëìŽ ìë íŽëì€ì 몚ë íë¡íŒí°ì ë©ìë륌 ë¬Œë €ë°ì, ìë¡ìŽ íŽëì€ë¥Œ ìì±í©ëë€.
ìŽë Ʞ졎ì 믞늬 ì ìëìŽ ìë íŽëì€ë¥Œ ë¶ëªš íŽëì€(parent class) ëë ìì íŽëì€(super class)ëŒê³ í©ëë€.
ê·žëŠ¬ê³ ììì íµíŽ ìë¡ê² ìì±ëë íŽëì€ë¥Œ ìì íŽëì€(child class) ëë íì íŽëì€(sub class)ëŒê³ í©ëë€.
PHPììë ìì(inheritance)ì íµíŽ íŽëì€ ê°ì ê³ìžµ êŽê³ë¥Œ ë§ë€ ì ììµëë€.
ìì(child) íŽëì€ë ë¶ëªš(parent) íŽëì€ì 몚ë public, protected ë©€ë²ë¥Œ ììë°ê² ë©ëë€.
PHPììë extend í€ìë륌 ì¬ì©íì¬ ììì ì ìí©ëë€.
ë€ì ìì ë A íŽëì€ë¥Œ ììë°ë B íŽëì€ë¥Œ ì ìíë ìì ì ëë€.
class B extends A {
B íŽëì€ë§ì íë¡íŒí°ì ë©ìë;
}
ìì ìì ìì B íŽëì€ë A íŽëì€ì ìì íŽëì€ê° ëê³ , ë°ëë¡ A íŽëì€ë B íŽëì€ì ë¶ëªš íŽëì€ê° ë©ëë€.
B íŽëì€ë A íŽëì€ì private ë©€ë²ë¥Œ ì ìží 몚ë íë¡íŒí°ì ë©ìë륌 ììë°ì ì¬ì©í ì ììµëë€.
ì¬êž°ì íìíë€ë©Ž ìì ë§ì íë¡íŒí°ì ë©ìë륌 ì¶ê°í ì ììµëë€.
ìŽë ê² ììì ìŽì©í멎 Ʞ졎ì ìì±ë íŽëì€ë¥Œ ììœê² ì¬íì©í ì ììµëë€.
ëí, ê³µíµì ìž ë¶ë¶ì ë¶ëªš íŽëì€ì 믞늬 ìì±íì¬, ìì íŽëì€ìì ì€ë³µëë ë¶ë¶ì ì ê±°í ìë ììµëë€.
PHPììë ë ìŽìì ë¶ëªš íŽëì€ìì íë¡íŒí°ì ë©ìë륌 ììë°ì ìë ììµëë€.
íëì ë¶ëªš íŽëì€ê° ì¬ë¬ ìì íŽëì€ë¥Œ ê°ì§ ìë ìì§ë§, ìì íŽëì€ë ì€ì§ ë¶ëªš íŽëì€ë¥Œ íëë§ ê°ì§ ì ììµëë€.
ì€ë²ëŒìŽë©(overriding)ìŽë ìŽë¯ž ì ìë ë©ìë륌 ê°ì ìŽëŠì ë©ìëë¡ ë€ì ì ìíë ê²ìŽëŒê³ í ì ììµëë€.
ìŠ, ë©ìë ì€ë²ëŒìŽë©ìŽë ììë°ì ë¶ëªš íŽëì€ì ë©ìë륌 ì¬ì ìíì¬ ì¬ì©íë ê²ì ì믞í©ëë€.
PHPììë ë¶ëªš íŽëì€ì ë©ìëì ìŽëŠë§ ìì±í멎, íŽë¹ ë©ìë륌 ì€ë²ëŒìŽë©í ì ììµëë€.
class A
{
public $property = "class A";
public function showProperty()
{
echo $this->property."<br>";
}
}
class B extends A // íŽëì€ A륌 ìì ë°ì.
{
public $property = "class B";
public function showProperty() // íŽëì€ Aì ë©ìë륌 ì€ë²ëŒìŽë©
{
echo "hello ".$this->property."<br>";
}
}
$a = new A();
$a->showProperty(); // íŽëì€ Aì ë©ìë ížì¶
$b = new B();
$b->showProperty(); // íŽëì€ Bì ë©ìë ížì¶
ìì ìì ìì ìì íŽëì€ìž B íŽëì€ë ë¶ëªš íŽëì€ìž A íŽëì€ë¡ë¶í° ììë°ì showProperty() ë©ìë륌 ì€ë²ëŒìŽë©íì¬ ì¬ì©í©ëë€.
ë°ëŒì B íŽëì€ì ìžì€íŽì€ìž $bìì showProperty() íšì륌 ížì¶í멎, ì€ë²ëŒìŽë©ë B íŽëì€ì showProperty() íšìê° ížì¶ë©ëë€.
íŽëì€ë¥Œ ì ìí ë static í€ìë륌 ì¬ì©í íë¡íŒí°ì ë©ìëë íŽë¹ íŽëì€ì ìžì€íŽì€ë¥Œ ìì±íì§ ììë ì ê·Œí ì ìê² ë©ëë€.
ìŽë¬í íë¡íŒí°ì ë©ìë륌 ì ì ë©€ë²(static member)ëŒê³ í©ëë€.
ìŽë¬í ì ì ë©€ë²ì í¹ì§ì ë€ì곌 ê°ìµëë€.
- static í€ìëë¡ ì ìžë ì ì íë¡íŒí°ë ìžì€íŽì€íë ê°ì²Žììë ì ê·Œí ì ììµëë€.
- static í€ìëë¡ ì ìžë ì ì ë©ìëë ìžì€íŽì€íë ê°ì²Žììë ì ê·Œí ì ììµëë€.
- ì ì ë©ìë ëŽììë $this ìì¬ ë³ì륌 ì¬ì©í ì ììµëë€.
class StaticMember
{
public static $staticProperty = "static property";
public static function showProperty()
{
echo self::$staticProperty;."<br>";
}
}
echo StaticMember::showProperty(); // ížì¶ ê°ë¥
echo StaticMember::$staticProperty; // ì ê·Œ ê°ë¥
$var = new StaticMember(); // ìžì€íŽì€ ìì±
echo $var->showProperty(); // ížì¶ ê°ë¥
//echo $var->$staticProperty; // ì ê·Œ ë¶ê°ë¥
ìì ìì ìì ì ì ë©ìëìž showProperty() ë©ìëììë ìì ì ê°ëЬí€ë $this ìì¬ ë³ì륌 ì¬ì©í ì ììµëë€.
ë°ëŒì self í€ìëì íšê» ë²ì ì§ì ì°ì°ì륌 ì¬ì©íì¬ íë¡íŒí°ì ì ê·Œíê³ ììµëë€.
ëí, ìì±ë ìžì€íŽì€ììë ì ì íë¡íŒí°ì ì ê·Œí ì ììì 볎ì¬ì£Œê³ ììµëë€.
íŽëì€ì íë¡íŒí°ë ë©ìëì ì ê·Œíêž° ìíŽìë ìžì€íŽì€ë¥Œ ìì±íê³ , íìŽí ì°ì°ì(->)륌 ì¬ì©íŽìŒ í©ëë€.
íì§ë§ ëšìí íŽëì€ì ì ì ëŽìì íë¡íŒí°ë ë©ìë륌 ì¬ì©íê³ ì¶ì ëë ë²ì ì§ì ì°ì°ì(::)륌 ì¬ì©í ì ììµëë€.
ë²ì ì§ì ì°ì°ì(::)ë íŽëì€ì ìì, ì ì (static) ë©€ë² ëë ì¬ì ìë ë©€ë²ì ì ê·Œí ì ìê² íŽì€ëë€.
íŽëì€ì ì ì ìžë¶ìì ìì ê°ì ë©€ë²ì ì ê·Œí ëë íŽëì€ì ìŽëŠì ì¬ì©íŽìŒ í©ëë€.
echo OtherClassName::CONSTANT;
ëí, ë€ì í€ìë륌 ì¬ì©í멎 íŽëì€ì ì ì ëŽìì í¹ì íë¡íŒí°ë ë©ìëì ì ê·Œí ì ììµëë€.
- self : ìêž° ìì ì ì ê·Œí ë
- parent : ë¶ëªš íŽëì€ì ì ê·Œí ë
echo self::$property;
echo parent::CONSTANT;
ì¶ì ë©ìë(abstract method)ë ìì íŽëì€ìì ë°ëì ì€ë²ëŒìŽë©íŽìŒë§ ì¬ì©í ì ìë ë©ìë륌 ì믞í©ëë€.
ìŽë¬í ì¶ì ë©ìëë ì ìžë¶ë§ìŽ ì¡Žì¬íë©°, 구íë¶ë ìì±ëìŽ ìì§ ììµëë€.
ë°ë¡ ìŽ ìì±ëìŽ ìì§ ìì 구íë¶ë¥Œ ìì íŽëì€ìì ì€ë²ëŒìŽë©íì¬ ì¬ì©íë ê²ì
ëë€.
Important
묞ë²abstract ì ê·Œì ìŽì function ë©ìëìŽëŠ();
PHPììë ìµìí íë ìŽìì ì¶ì ë©ìë륌 í¬íšíë íŽëì€ë¥Œ ì¶ì íŽëì€(abstract class)ëŒê³ í©ëë€.
ìŽë¬í ì¶ì íŽëì€ë ê°ì²Ž ì§í¥ íë¡ê·žëë°ìì ì€ìí í¹ì§ìž ë€íì±ì ê°ì§ ë©ìëì ì§í©ì ì ìí ì ìê² íŽì€ëë€.
ìŠ, ë°ëì ì¬ì©ëìŽìŒ íë ë©ìë륌 ì¶ì íŽëì€ì ì¶ì ë©ìëë¡ ì ìžíŽ ëìŒë©Ž, ìŽ íŽëì€ë¥Œ ììë°ë 몚ë íŽëì€ììë ìŽ ì¶ì ë©ìë륌 ë°ëì ì¬ì ìíŽìŒ í©ëë€.
abstract class AbstractClass // ì¶ì íŽëì€
{
abstract protected function move(); // ì¶ì ë©ìë
abstract protected function stop();
public function start() // ê³µíµ ë©ìë
{
...
}
}
ìŽë¬í ì¶ì íŽëì€ë ëììŽ ì ìëìŽ ìì§ ìì ì¶ì ë©ìë륌 í¬íšíê³ ììŒë¯ë¡, ìžì€íŽì€ë¥Œ ìì±í ì ììµëë€.
ì¶ì íŽëì€ë 뚌ì ììì íµíŽ ìì íŽëì€ë¥Œ ë§ë€ê³ , ë§ë ìì íŽëì€ìì ì¶ì íŽëì€ì 몚ë ì¶ì ë©ìë륌 ì€ë²ëŒìŽë©íê³ ëììŒ ë¹ë¡ì ìì íŽëì€ì ìžì€íŽì€ë¥Œ ìì±í ì ìê² ë©ëë€.
PHPìì ìží°íìŽì€(interface)ë ë€ë¥ž íŽëì€ë¥Œ ìì±í ë êž°ë³žìŽ ëë íì ì ê³µí멎ì, ë€ë¥ž íŽëì€ ì¬ìŽì ì€ê° ë§€ê° ìí ë ëŽë¹íë ìŒì¢ ì ì¶ì íŽëì€ë¥Œ ì믞í©ëë€.
ìží°íìŽì€ë¥Œ ì¬ì©í멎 íŽëì€ê° ë°ëì 구ííŽìŒ í ë©ìëê° ìŽë»ê² ëìíëì§ë¥Œ ì íì ììŽ ë€ë¥ž ë¶ë¶ì ìœë륌 ìì±í ì ììµëë€.
ìŽë¬í ìží°íìŽì€ë ë©ìëì 구íë¶ê° ì ìëìŽ ìì§ ìì ì¶ì ë©ìëë€ë¡ 구ì±ëìŽ ììŒë©°, ëŽë¶ì 몚ë ì¶ì ë©ìëë public ë©ìëì ëë€.
PHPììë interface í€ìë륌 ì¬ì©íì¬ ìží°íìŽì€ë¥Œ ì ìí©ëë€.
Important
묞ë²interface ìží°íìŽì€ìŽëŠ { 구íí ë©ìë;}
ìŽë ê² ì ìë ìží°íìŽì€ë implements í€ìë륌 ì¬ì©íì¬ êµ¬íí ì ììµëë€.
ìží°íìŽì€ë¥Œ 구ííë íŽëì€ë ìží°íìŽì€ì 몚ë ë©ìë륌 구ííŽìŒ í©ëë€.
ìŽë ê² êµ¬íëë ë©ìëë ìží°íìŽì€ìì ì ìë ííì ìì í ê°ì ííë¡ ì ìëìŽìŒ í©ëë€.
ìží°íìŽì€ì 몚ë ë©ìëë íŽëì€ ììì 몚ë 구íëìŽìŒ í©ëë€.
interface Transport // ìží°íìŽì€ì ì ì
{
public function move(); // 구íí ë©ìë
public function stop();
}
class Car implements Transport // Transport ìží°íìŽì€ë¥Œ 구ííë Car íŽëì€
{
function move() // ë©ìë 구í
{
...
}
function stop() // ë©ìë 구í
{
...
}
}
# ìží°íìŽì€(interface)ë íŽëì€ì²ëŒ extends í€ìë륌 ì¬ì©íì¬ ììë°ì ì ììµëë€.
interface Transport // ìží°íìŽì€ì ì ì
{
public function move(); // 구íí ë©ìë
public function stop(); // 구íí ë©ìë
}
interface Overland extends Transport // Transport ìží°íìŽì€ë¥Œ ììë°ë Overland ìží°íìŽì€
{
public function highpass(); // 구íí ë©ìë
}
class Car implements Overload // Overland ìží°íìŽì€ë¥Œ 구ííë Car íŽëì€
{
function move() // ë©ìë 구í
{
...
}
function stop() // ë©ìë 구í
{
...
}
function highpass() // ë©ìë 구í
{
...
}
}
Important
PHP ìží°íìŽì€ë íŽëì€ìë ë¬ëЬ ê°ê°ì ìží°íìŽì€ë¥Œ ìŒí(,)ë¡ êµ¬ë¶íì¬ ì¬ë¬ ê°ì ìží°íìŽì€ë¥Œ ëìì ììë°ì ì ììµëë€.
ë€íì±(polymorphism)ìŽë íëì íë¡íŒí°ê° ì¬ë¬ ê°ì§ ìí륌 ê°ì§ ì ìë ê²ì ì믞í©ëë€.
PHPììë ìŽë¬í ë€íì±ì ì€ë²ë¡ë©(overloading)곌 ì§ì° ì ì ë°ìžë©(late static bindings)ì íµíŽ êµ¬ííê³ ììµëë€.
ë€íì±ì ìì, ì¶ìíì ëë¶ìŽ ê°ì²Ž ì§í¥ íë¡ê·žëë°ì 구ì±íë ì€ìí í¹ì§ ì€ íëì ëë€.
ë€ë¥ž ëë¶ë¶ì ê°ì²Ž ì§í¥ íë¡ê·žëë° ìžìŽìì ì€ë²ë¡ë©(overloading)ì ë§€ê°ë³ìì ê°ìì íì
ì ë¬ëЬíì¬ ê°ì ìŽëŠì ë©ìë륌 ì€ë³µíì¬ ì ìíë ê²ì ì믞í©ëë€.
íì§ë§ PHPììë ë€ë¥ž ìžìŽìë ë¬ëЬ íë¡íŒí°ë ë©ìë륌 ëì ìŒë¡ 'ìì±íë€'ë ìë¯žë¡ ì€ë²ë¡ë©ì ì¬ì©í©ëë€.
ìŽë ê² ëì ìŒë¡ ìì±ë ë©€ë²ë íŽë¹ íŽëì€ì ë§€ì§ ë©ìë(magic method)륌 íµíŽ ë€ìí ííë¡ ì²ëЬí ì ììµëë€.
ìŽë ì€ë²ë¡ë©ëë ë©ìëë ë°ëì publicìŒë¡ ì ìëìŽìŒë§ í©ëë€.
Important
ë§€ì§ ë©ìë(magic method)ë PHPìì í¹ìí êž°ë¥ì ìíŽ ë¯žëŠ¬ ì ìí ë©ìë륌 ê°ëЬíµëë€.ìŽë¬í ë§€ì§ ë©ìëë ë©ìë ìŽëŠê³Œ ë§€ê°ë³ì, ë°í íì , ížì¶ì íìŽë°ë§ìŽ ì íŽì ž ììŒë©°, ê·ž ëŽì©ì ì¬ì©ìê° ì§ì ìì±íì¬ ì¬ì©í ì ììµëë€.PHPìì 몚ë ë§€ì§ ë©ìëì ìŽëŠì ë ê°ì ìžëì€ìœìŽ(__)ë¡ ììí©ëë€.
PHPììë ì ê·Œ ë¶ê° íë¡íŒí°(inaccessible property)륌 ì€ë²ë¡ë©íêž° ìíŽ ë€ì곌 ê°ì ë§€ì§ ë©ìë륌 구ííŽìŒ í©ëë€.
Important
ë§€ì§ ë©ìëì ìípublic void __set(string $name, mixed $value)public mixed __get(string $name)public bool __isset(string $name)public bool __unset(string $name)
- __set() ë©ìëë ì ê·Œ ë¶ê° íë¡íŒí°ì ê°ì ì€ì í ë ížì¶ë©ëë€.
- __get() ë©ìëë ì ê·Œ ë¶ê° íë¡íŒí°ì ê°ì ìœì ë ížì¶ë©ëë€.
- __isset() ë©ìëë ì ê·Œ ë¶ê° íë¡íŒí°ì ëíŽ isset() íšìë empty() íšìê° ížì¶ë ë ížì¶ë©ëë€.
- __unset() ë©ìëë ì ê·Œ ë¶ê° íë¡íŒí°ì ëíŽ unset() íšìê° ížì¶ë ë ížì¶ë©ëë€.
Important
ì ê·Œë¶ê° íë¡íŒí°(inaccessible property)ë íì¬ ììììë ì ìëìŽ ìì§ ìê±°ë, ì ê·Œ ì ìŽë¡ ìžíŽ ë³ŽìŽì§ ìë íë¡íŒí°ë¥Œ ì믞í©ëë€.
class PropertyOverloading
{
private $data = array(); // ì€ë²ë¡ë©ë ë³ìê° ì ì¥ë ë°°ìŽ ìì±
public $declared = 10; // publicìŒë¡ ì ìžë íë¡íŒí°
private $hidden = 20; // privateë¡ ì ìžë íë¡íŒí°
public function __set($name, $value)
{
echo "$name íë¡íŒí°ë¥Œ {$value}ì ê°ìŒë¡ ìì±í©ëë€!";
$this->data[$name] = $value;
}
public function __get($name)
{
echo "$name íë¡íŒí°ì ê°ì ìœìµëë€!<br>";
if (array_key_exists($name, $this->data)) {
return $this->data[$name];
} else {
return null;
}
}
public function __isset($name)
{
echo "$name íë¡íŒí°ê° ì€ì ëìŽ ìëì§ íìží©ëë€!<br>";
return isset($this->data[$name]);
}
public function __unset($name)
{
echo "$name íë¡íŒí°ë¥Œ íŽì§í©ëë€!";
unset($this->data[$name]);
}
}
$obj = new PropertyOverloading(); // PropertyOverloading ê°ì²Ž ìì±
â $obj->prop = 1; // ëì íë¡íŒí° ìì±
â¡ echo $obj->prop; // ëì íë¡íŒí°ì ì ê·Œ
⢠var_dump(isset($obj->prop)); // ëì íë¡íŒí°ë¡ isset() íšì ížì¶
⣠unset($obj->prop); // ëì íë¡íŒí°ë¡ unset() íšì ížì¶
†var_dump(isset($obj->prop)); // ëì íë¡íŒí°ë¡ isset() íšì ížì¶
⥠echo $obj->declared; // ì ìžë íë¡íŒí°ë ì€ë²ë¡ë©ì ì¬ì©íì§ ìì.
⊠echo $obj->hidden; // privateë¡ ì ìžë íë¡íŒí°ë íŽëì€ ìžë¶ìì ì ê·Œí ì ììŒë¯ë¡, ì€ë²ë¡ë©ì ì¬ì©íš.
ìì ìì ììë íë¡íŒí°ë¥Œ ì€ë²ë¡ë©íêž° ìíŽ __set(), __get(), __isset(), __unset() ë©ìë륌 구ííê³ ììµëë€.
â ë² ëŒìžììë ëì ìŒë¡ íë¡íŒí°ë¥Œ ìì±íê³ , â¡ë² ëŒìžììë ê·ž ê°ì ì ê·Œí©ëë€.
â¢ê³Œ â€ë² ëŒìžììë ìì±ë ëì íë¡íŒí°ë¥Œ isset() íšìì ìžìë¡ ì ë¬íê³ , â£ë² ëŒìžììë unset() íšìì ìžìë¡ ì ë¬í©ëë€.
ìŽë â ë²ë¶í° â€ë² ëŒìžê¹ì§ì 몚ë ëìì ìì 구íí ë€ ê°ì§ ë©ìëê° ìí©ì ë§ê² ìë ížì¶ëšìŒë¡ìš ìŽë£šìŽì§ëë€.
íì§ë§ â¥ë² ëŒìžê³Œ ê°ìŽ ìŒë°ì ìž ë°©ë²ìŒë¡ ì ìžë íë¡íŒí°ì ì ê·Œí ëë __get() ë©ìë륌 ížì¶íì§ ììµëë€.
ë€ë§, âŠë² ëŒìžì²ëŒ privateë¡ ì ìžë íë¡íŒí°ë íŽëì€ ìžë¶ììë ì ê·Œí ì ììŒë¯ë¡, __get() ë©ìë륌 ížì¶íê² ë©ëë€.
Important
array_key_exists() íšìë ìžìë¡ ì ë¬ë°ì í€ê° íŽë¹ ë°°ìŽì ì ì¥ëìŽ ììŒë©Ž true륌 ë°ííê³ , ì ì¥ëìŽ ìì§ ììŒë©Ž false륌 ë°ííë íšìì ëë€.
PHPììë ì ê·Œë¶ê° ë©ìë(inaccessible method)륌 ì€ë²ë¡ë©íêž° ìíŽ ë€ì곌 ê°ì ë§€ì§ ë©ìë륌 구ííŽìŒ í©ëë€.
Important
ë§€ì§ ë©ìëì ìí1. public mixed __call(string $name, array $arguments)2. public static mixed __callStatic(string $name, array $arguments)
-
__call() ë©ìëë íŽëì€ ìììì ì ê·Œ ë¶ê° ë©ìë륌 ížì¶í ë ížì¶ë©ëë€.
-
__callStatic() ë©ìëë ì ì (static) ìììì ì ê·Œ ë¶ê° ë©ìë륌 ížì¶í ë ížì¶ë©ëë€.
class MethodOverloading
{
public function __call($name, $arguments)
{
echo join(", ", $arguments)."ìì ì ê·Œ ë¶ê° ë©ìë륌 ížì¶í©ëë€!";
}
public static function __callStatic($name, $arguments)
{
echo join(", ", $arguments)."ìì ì ê·Œ ë¶ê° ë©ìë륌 ížì¶í©ëë€!";
}
}
$obj = new MethodOverloading(); // MethodOverloading ê°ì²Ž ìì±
â $obj->testMethod("íŽëì€ ìì"); // íŽëì€ ìììì ì ê·Œ ë¶ê° ë©ìë ížì¶
â¡ MethodOverloading::testMethod("ì ì ìì"); // ì ì ìììì ì ê·Œ ë¶ê° ë©ìë ížì¶
ìì ìì ììë ë©ìë륌 ì€ë²ë¡ë©íêž° ìíŽ __call()곌 __callStatic() ë©ìë륌 구ííê³ ììµëë€.
â ë² ëŒìžììë ëì ìŒë¡ testMethod() ë©ìë륌 ìì±íê³ , ë°ë¡ ê·ž ê°ì ì ê·Œí©ëë€.
ìŽë íŽëì€ ìììì ìì±ë ëì ë©ìëì ì ê·Œíë¯ë¡, ì¬ì©ìê° êµ¬íí __call() ë©ìëê° ížì¶ë©ëë€.
â¡ë² ëŒìžììë MethodOverloading íŽëì€ì ì ì ìììì ëì ë©ìëì ì ê·Œí©ëë€.
ìŽë ì ì ìììì ìì±ë ëì ë©ìëì ì ê·Œíë¯ë¡, ì¬ì©ìê° êµ¬íí __callStatic() ë©ìëê° ížì¶ë©ëë€.
ë°ìžë©(binding)ìŽë íë¡ê·žëšì ì¬ì©ë êµ¬ì± ììì ì€ì ê° ëë íë¡íŒí°ë¥Œ ê²°ì ì§ë íì륌 ì믞í©ëë€.
ì륌 ë€ìŽ íšì륌 ížì¶íë ë¶ë¶ìì ì€ì íšìê° ìì¹í ë©ëªšëŠ¬ë¥Œ ì°ê²°íë ê²ë ë°ë¡ ë°ìžë©ì
ëë€.
ìŽë¬í ë°ìžë©ì í¬ê² ë€ì곌 ê°ìŽ êµ¬ë¶í ì ììµëë€.
- ì ì ë°ìžë©(static binding) : ì€í ìê° ì ì ìŒìŽëê³ , ì€í ìê°ìë ë³íì§ ìì ìíë¡ ì ì§ëë ë°ìžë©ì.
- ëì ë°ìžë©(dynamic binding) : ì€í ìê°ì ìŽë£šìŽì§ê±°ë ì€í ìê°ì ë³ê²œëë ë°ìžë©ì.
ìŽë¬í ëì ë°ìžë©ì ëŠì ë°ìžë©(late binding)ìŽëŒê³ ë ë¶ëŠœëë€.
íì§ë§ PHPììë ì ì ë°ìžë©ê³Œ ëì ë°ìžë©ì ì€ê° ì ë ìì€ìž ëŠì ì ì ë°ìžë©(LSB)ì ì ê³µíê³ ììµëë€.
PHP 5.3.0ë¶í° ì ê³µëë ëŠì ì ì ë°ìžë©(LSB)ì static í€ìëì íšê» ë²ì ì§ì ì°ì°ì(::)륌 ì¬ì©íì¬ ìíí ì ììµëë€.
ëŠì ì ì ë°ìžë©ì ë§ì§ë§ìŒë¡ ížì¶í ë¹ì ì¡ ížì¶(non-forwarding call)ì íŽëì€ ìŽëŠì ì ì¥íì¬ ëìí©ëë€.
ìŽë ì ì ë©ìë ížì¶ììë ë²ì ì§ì ì°ì°ì(::) ì¢ìž¡ì ëª
ìë íŽëì€ ìŽëŠì ì ì¥íë©°, ë¹ì ì ë©ìë ížì¶ììë íŽë¹ ê°ì²Žì íŽëì€ ìŽëŠì ì ì¥í©ëë€.
static::ì ì ìë íŽëì€ë¥Œ 컎íìŒ ìê°ì ê²°ì í ì ìê³ , íë¡ê·žëš ì€í ì ì ë¬ëë ì ë³Žë¡ ê²°ì íë¯ë¡ ëŠì ë°ìžë©ì
ëë€.
ëí, ì ì ë©ìë ížì¶ìë ì¬ì©í ì ììŒë¯ë¡ ì ì ë°ìžë©ìŽêž°ë í©ëë€.
Important
ë²ì ì§ì ì°ì°ì(::, scope resolution operator)ë íŽëì€ì ìì, ì ì (static) ë©€ë² ëë ì¬ì ìë ë©€ë²ì ì ê·Œí ì ìëë¡ íŽì£Œë ì°ì°ìì ëë€.
ë€ì ìì ë self í€ìëì íšê» ë²ì ì§ì ì°ì°ì(::)륌 ì¬ì©íì¬ ì ì ë©ìë륌 ížì¶íë ìì ì ëë€.
class A
{
public static function className()
{
echo __CLASS__;
}
public static function printClass()
{
self::className();
}
}
class B extends A
{
public static function className()
{
echo __CLASS__;
}
}
â B::printClass(); // A
ìì ìì ìì â ë² ëŒìžì ì€í 결곌ë íŽëì€ A륌 ì¶ë ¥í©ëë€.
ìŠ, íŽëì€ Bìì printClass() ë©ìë륌 ížì¶íì§ë§, ìŽ ë©ìëë íŽëì€ Aìì ì ìëë¯ë¡ íŽëì€ A륌 ì¶ë ¥íê² ë©ëë€.
ìŽì²ëŒ íì¬ íŽëì€ë¥Œ ì°žì¡°íë self::ì ìì __CLASS__ë ì¬ì©íë ë©ìëê° ìŽëì ì ìëìŽ ìëê°ì ë°ëŒ ê·ž ê°ìŽ ê²°ì ë©ëë€.
íì§ë§ ëŠì ì ì ë°ìžë©ì ì¬ì©í멎, íŽëì€ Bìì ížì¶í printClass() ë©ìëê° íì¬ íŽëì€ë¡ íŽëì€ B륌 ì°žì¡°íê² í ì ììµëë€.
ë€ì ìì ë static í€ìëì íšê» ë²ì ì§ì ì°ì°ì(::)륌 ì¬ì©íì¬ ì ì ë©ìë륌 ížì¶íë ìì ì ëë€.
class A
{
public static function className()
{
echo __CLASS__;
}
public static function printClass()
{
static::className();
}
}
class B extends A
{
public static function className()
{
echo __CLASS__;
}
}
â B::printClass(); // B
ìì ìì ìì â ë² ëŒìžì ì€í 결곌ë íŽëì€ B륌 ì¶ë ¥í©ëë€.
printClass() ë©ìëê° íŽëì€ Aìì ì ìëì§ë§, íŽëì€ Bìì ìŽ ë©ìë륌 ížì¶íë¯ë¡ íŽëì€ B륌 ì¶ë ¥íê² ë©ëë€.
ìŽì²ëŒ static í€ìëì ë²ì ì§ì ì°ì°ì(::)륌 íšê» ì¬ì©í멎 ëŠì ì ì ë°ìžë©ì ìíí ì ììµëë€.
ë€ì ìì ë static í€ìëì íšê» ë²ì ì§ì ì°ì°ì(::)륌 ì¬ì©íì¬ ë¹ì ì ë©ìë륌 ížì¶íë ìì ì ëë€.
class A
{
private function className()
{
echo __CLASS__."<br>";
}
public function printClass()
{
â $this->className();
â¡ static::className();
}
}
class B extends A
{
// className() ë©ìëë íŽëì€ Bë¡ ë³µì¬ëë¯ë¡,
// className() ë©ìëì ì íš ë²ìë ì¬ì í íŽëì€ Aì.
}
class C extends A
{
private function className()
{
// Ʞ졎ì className() ë©ìëê° ìŽ ë©ìëë¡ ë첎ëë¯ë¡,
// className() ë©ìëì ì íš ë²ìë ìŽì ë¶í° íŽëì€ Cê° ëš.
}
}
$b = new B();
⢠$b->printClass(); // A
// A
$c = new C();
⣠$c->printClass(); // A
// Fatal error : Call to private method C::className() from context 'A'
ìì ìì ìì className() ë©ìëë íŽëì€ Aìì ì²ììŒë¡ ì ìë©ëë€.
ê·žëŠ¬ê³ ì íŽëì€ Bê° íŽëì€ A륌 ììë°ì§ë§, íŽëì€ Bìì className() ë©ìë륌 ì¬ì ìíì§ë ììµëë€.
ë°ëŒì className() ë©ìëì ì íš ë²ìë ì¬ì í íŽëì€ Aê° ëë©°, â¢ë² ëŒìžì 결곌ì²ëŒ ë³ì $thisë static::ì 몚ë íŽëì€ A륌 ê°ëЬí€ê² ë©ëë€.
íì§ë§ íŽëì€ Cê° íŽëì€ A륌 ììë°ìŒë©Žì className() ë©ìë륌 ì¬ì ìí©ëë€.
ë°ëŒì className() ë©ìëì ì íš ë²ìë ìŽì ë¶í° íŽëì€ Cë¡ ë³ê²œë ê²ì ëë€.
ê·žë¬ë¯ë¡ â£ë² ëŒìžì 결곌ì²ëŒ ë³ì $thisë ì¬ì í íŽëì€ A륌 ê°ëЬí€ê² ì§ë§, static::ì íŽëì€ C륌 ê°ëЬí€ê² ë ê²ì ëë€.