PHP���ṩ������
��overloading����ָ��̬������
�����Ժͷ�����������ͨ��ħ��������magic methods����ʵ�ֵġ�
�����õ�ǰ������δ������ɼ��������Ի�ʱ�����ط����ᱻ���á����ں��潫ʹ�����ɷ������ԣ�inaccessible
properties��
�����ɷ��ʷ�����inaccessible
methods��
���ƺ���Щδ����ɼ��������Ի���
���е����ط��������뱻����Ϊ public��
Note:
��Щħ�������IJ���������ͨ�����ô�����
Note:
PHP�е�
���������������������������Բ�ͬ����ͳ�������������ṩ���ͬ������������������IJ������ͺ�����ͬ��
�汾 | ˵�� |
---|---|
5.3.0 | ���� __callStatic()ħ���������ɼ���δ����Ϊ public ��δ����Ϊ static ��ʱ������һ�����档 |
5.1.0 | ���� __isset() �� __unset() ����ħ�������� |
$name
) : bool$name
) : void�ڸ����ɷ������Ը�ֵʱ��__set() �ᱻ���á�
��ȡ���ɷ������Ե�ֵʱ��__get() �ᱻ���á�
���Բ��ɷ������Ե��� isset() �� empty() ʱ��__isset() �ᱻ���á�
���Բ��ɷ������Ե��� unset() ʱ��__unset() �ᱻ���á�
���� $name ��ָҪ�����ı������ơ�__set() ������ $value ����ָ���� $name ������ֵ��
��������ֻ���ڶ����н��С��ھ�̬�����У���Щħ�����������ᱻ���á�������Щ���������ܱ� ����Ϊ static���� PHP 5.3.0 ��, ����Щħ����������Ϊ static �����һ�����档
Note:
��Ϊ PHP ����ֵ����ķ�ʽ��__set() �ķ���ֵ�������ԡ����Ƶ�, ��������������ʽ��ֵ�У�__get() ���ᱻ���ã�
$a = $obj->b = 8;
Note:
�ڳ� isset() ����������Խṹ����ʹ�����ص����ԣ�����ζ�ŵ���һ�����ص�����ʹ�� empty() ʱ������ħ�����������ᱻ���á�
Ϊ�ܿ������ƣ����뽫�������Ը�ֵ�����ر�����ʹ�� empty()��
Example #1 ʹ�� __get()��__set()��__isset() �� __unset() ������������
<?php
class PropertyTest {
/** �����ص����ݱ����ڴ� */
private $data = array();
/** ���ز��ܱ������Ѿ���������� */
public $declared = 1;
/** ֻ�д����ⲿ�����������ʱ�����زŻᷢ�� */
private $hidden = 2;
public function __set($name, $value)
{
echo "Setting '$name' to '$value'\n";
$this->data[$name] = $value;
}
public function __get($name)
{
echo "Getting '$name'\n";
if (array_key_exists($name, $this->data)) {
return $this->data[$name];
}
$trace = debug_backtrace();
trigger_error(
'Undefined property via __get(): ' . $name .
' in ' . $trace[0]['file'] .
' on line ' . $trace[0]['line'],
E_USER_NOTICE);
return null;
}
/** PHP 5.1.0֮��汾 */
public function __isset($name)
{
echo "Is '$name' set?\n";
return isset($this->data[$name]);
}
/** PHP 5.1.0֮��汾 */
public function __unset($name)
{
echo "Unsetting '$name'\n";
unset($this->data[$name]);
}
/** ��ħ������ */
public function getHidden()
{
return $this->hidden;
}
}
echo "<pre>\n";
$obj = new PropertyTest;
$obj->a = 1;
echo $obj->a . "\n\n";
var_dump(isset($obj->a));
unset($obj->a);
var_dump(isset($obj->a));
echo "\n";
echo $obj->declared . "\n\n";
echo "Let's experiment with the private property named 'hidden':\n";
echo "Privates are visible inside the class, so __get() not used...\n";
echo $obj->getHidden() . "\n";
echo "Privates not visible outside of class, so __get() is used...\n";
echo $obj->hidden . "\n";
?>
�������̻������
Setting 'a' to '1' Getting 'a' 1 Is 'a' set? bool(true) Unsetting 'a' Is 'a' set? bool(false) 1 Let's experiment with the private property named 'hidden': Privates are visible inside the class, so __get() not used... 2 Privates not visible outside of class, so __get() is used... Getting 'hidden' Notice: Undefined property via __get(): hidden in <file> on line 70 in <file> on line 29
�ڶ����е���һ�����ɷ��ʷ���ʱ��__call() �ᱻ���á�
�ھ�̬�������е���һ�����ɷ��ʷ���ʱ��__callStatic() �ᱻ���á�
$name ������Ҫ���õķ������ơ�$arguments ������һ��ö�����飬������Ҫ���ݸ����� $name �IJ�����
Example #2 ʹ�� __call() �� __callStatic() �Է�������
<?php
class MethodTest
{
public function __call($name, $arguments)
{
// ע��: $name ��ֵ���ִ�Сд
echo "Calling object method '$name' "
. implode(', ', $arguments). "\n";
}
/** PHP 5.3.0֮��汾 */
public static function __callStatic($name, $arguments)
{
// ע��: $name ��ֵ���ִ�Сд
echo "Calling static method '$name' "
. implode(', ', $arguments). "\n";
}
}
$obj = new MethodTest;
$obj->runTest('in object context');
MethodTest::runTest('in static context'); // PHP 5.3.0֮��汾
?>
�������̻������
Calling object method 'runTest' in object context Calling static method 'runTest' in static context