1 __construct().当实例一个对象时会先执行此方法,当子类实例化时会先执行父类的构造,这个没什么好说的和java,c#等oop语言一样。例如:
<?php
class BaseClass {
function __construct() {
print "In BaseClass constructor\n";
}
}
class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "In SubClass constructor\n";
}
}
$obj = new BaseClass();
$obj = new SubClass();
//In BaseClass constructor In BaseClass constructor In SubClass constructor
?>
2.__destruct析构方法的概念和其他面向对象的语言(比如java(垃圾回收机制))是一样的。当指向这个对象的最后一个引用被销毁的时候,析构方法被调用,调用完成后释放内存。(先销毁父类在子类)注意:析构方法不接受任何参数。
<?php
class MyDestructableClass {
function __construct() {
print "In constructor\n";
$this->name = "MyDestructableClass";
}
function __destruct() {
print "Destroying " . $this->name . "\n";
}
}
$obj = new MyDestructableClass();
//In constructor Destroying MyDestructableClass
?>
3。__autoload()拦截函数在一个未声明的类被初始化的时候自动调用。该类的名字会被自动传递给__autoload()函数。而__autoload()也只有这么唯一的一个参数。
<?php
class ClassName{
public function __construct(){
echo "加载me";
}
}
?>
<?php
function __autoload($className) {
include_once $className . ".php";
}
$object = new ClassName();//加载me
?>
4. __get传递属性的名字 并返回属性的值 __set 传递属性的名字 和新的值,两个是一般是一起使用的,不过与java中的getter setter有一点不一样,看例子
<?php
class StrictCoordinateClass{
private $arr = array('x'=>NULL,'y'=>NULL);
public function __get($property){
echo "key--------------->".$property;
echo "<br>";
if(array_key_exists($property,$this->arr)){
return $this->arr[$property];
}else{
echo "没有找到这一个属性";
}
}
public function __set($property,$value){
echo "property------------------->".$property."<br>";
echo "value---------------------->".$value."<br>";
if(array_key_exists($property,$this->arr)){
$this->arr[$property] = $value;
}else{
print "__set错误";
}
}
}
$obj = new StrictCoordinateClass();
$obj->x = 1;//进行set 赋值
echo $obj->x;//get方法取值
echo "<br>";
$obj->n = 2;
print $obj->n;
//property------------------->x
//value---------------------->1
//key--------------->x
//1
//property------------------->n
//value---------------------->2
//__set错误key--------------->n
//没有找到这一个属性
?>
5..__call 有点像c#中的委托 传递方法的名字和一个数字索引数字 数组包含传递的参数 第一参数的索引0
<?php
class HelloWorld {
function display($count) {
for ($i = 0; $i < $count; $i++) {
print "Hello world\n";
}
return $count;
}
}
class HelloWorldDelegator {
private $obj;
function __construct() {
$this->obj = new HelloWorld();
}
function __call($method, $args) {
echo "method---------------->" . $method;
echo "<br>";
echo "args------------------>" . print_r($args, true);
//call_user_func_array("回调函数(对象,方法)",数组参数)
return call_user_func_array(array (
$this->obj,
$method
), $args);
}
}
$obj = new HelloWorldDelegator();
print $obj->display(3);
//method---------------->display
//args------------------>Array ( [0] => 3 ) Hello world Hello world Hello world 3
?>
总结:
//php能通过实现特殊的代理方法对属性的访问和方法的调用进行重载
//function __get($property);__get 传递属性的名字 并返回属性的值
//function __set($property,$value);//传递属性的名字 和新的值
//function __call($method,$args);//传递方法的名字和一个数字索引数字 数组包含传递的参数 第一参数的索引0
//__get __set是对成员属性来说 __call 是 对方法来说
<?php
/*
* Created on 2010-8-26
*
* 魔术方法的使用
*
*/
class Test {
/*******
* @param string 属性的名称
*/
public function __get($key) {
echo $key . " 不存在";
}
/*******
* @param string 要赋值的成员变量名称
* @param string 要赋的值
*/
public function __set($key,$value){
echo "对".$key."赋值".$value;
}
/******
* @param string 方法名
* @param array 参数列表
* */
public function __call($key,$args){
echo "您要调用的 {$key} 方法不存在。你传入的参数是:" . print_r($args, true);
}
}
$t = new Test();
echo $t->name;
echo "<br>";
$t->name = "aninggo";
echo "<br>";
$t->getName("asdf","go");
//name 不存在
//对name赋值aninggo
//您要调用的 getName 方法不存在。你传入的参数是:Array ( [0] => asdf [1] => go )
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com