
谁能用比较通俗的语言解释一下php类中的构造函数,他的作用以及为什么会存在?
看了面向对象,记是能记住当完全不知道干什么用的,导致写程序是根本不知道怎么用,过段时间又忘了,求个好心人解释一下,还有里面的__set和__get方法,完全看不懂,在类中...
看了面向对象,记是能记住当完全不知道干什么用的,导致写程序是根本不知道怎么用,过段时间又忘了,求个好心人解释一下,还有里面的__set和__get方法,完全看不懂,在类中写这个是干嘛用的?反正都是修改属性值,直接修改和间接修改有何区别?php是看了忘,忘了看,精神遭受到不断的折磨...
展开
3个回答
2012-04-12 · 知道合伙人软件行家
关注

展开全部
从php5以后的版本,php的类就可以使用魔术方法了。
php规定以两个下划线(__)开头的方法都保留为魔术方法,所以建议大家函数名最好不用__开头,除非是为了重载已有的魔术方法。
PHP中的魔术方法有 :__construct,__destruct,__get, __set等
__get、__set 这两个方法是为在类和他们的父类中没有声明的属性而设计的。
__get( $property ) 当调用一个未定义的属性时,此方法会被触发,传递的参数是被访问的属性名
__set( $property, $value ) 给一个未定义的属性赋值时,此方法会被触发,传递的参数是被设置的属性名和值
这里的没有声明包括当使用对象调用时,访问控制为proteced,private的属性(即没有权限访问的属性)。
在php语言中,类构造器有两种方法,一种是使用__construct,另一种是使用与类同名的方法。
__construct 构造方法,当一个对象创建时调用此方法,相对于PHP4使用此方法的好处是:可以使构造方法有一个独一无二的名称,无论它所在的类的名称是什么.这样你在改变类的名称时,就不需要改变构造方法的名称。
php规定以两个下划线(__)开头的方法都保留为魔术方法,所以建议大家函数名最好不用__开头,除非是为了重载已有的魔术方法。
PHP中的魔术方法有 :__construct,__destruct,__get, __set等
__get、__set 这两个方法是为在类和他们的父类中没有声明的属性而设计的。
__get( $property ) 当调用一个未定义的属性时,此方法会被触发,传递的参数是被访问的属性名
__set( $property, $value ) 给一个未定义的属性赋值时,此方法会被触发,传递的参数是被设置的属性名和值
这里的没有声明包括当使用对象调用时,访问控制为proteced,private的属性(即没有权限访问的属性)。
在php语言中,类构造器有两种方法,一种是使用__construct,另一种是使用与类同名的方法。
__construct 构造方法,当一个对象创建时调用此方法,相对于PHP4使用此方法的好处是:可以使构造方法有一个独一无二的名称,无论它所在的类的名称是什么.这样你在改变类的名称时,就不需要改变构造方法的名称。
追问
clss show
{
var $name;//这里为什么需要var来定义?这个有没有错?在旧版中是这样的,新版的去掉了var
function __set($x,$value)
{
$this->$x = $value;
}
function __get($x)
{
return $this->$x;
}
}
$showInfo = new show;
$showInfo->$name = 10;//为什么用的是这个形式?不是$showInfo->name,还有为什么这个等式就能设定name的值,完全没看见它调用__set方法啊
追答
1.
类中定义变量(属性成员),一般不用var关键字定义,而是代以:private/public/protected 这三种分别代码三种变量作用范围的关键字。
可以用 var 关键字进行定义,这样定义的效果与 public $name; 是等同的。
2. $showInfo->$name = 10;//为什么用的是这个形式?不是$showInfo->name
应该使用$showInfo->name,而不应该是 $showInfo->$name = 10;
后一种调用会弹出警告:未定义的变量的错误提示。
3. 为什么这个等式就能设定name的值,完全没看见它调用__set方法啊
首先,__get、__set 这两个方法是为在类和他们的父类中没有声明的属性而设计的。
__get( $property ) 当调用一个未定义的属性时,此方法会被触发,传递的参数是被访问的属性名
__set( $property, $value ) 给一个未定义的属性赋值时,此方法会被触发,传递的参数是被设置的属性名和值
其次,当你
$showInfo->name = 10; 的时候,就会自动触发 __set
echo $showInfo->name 的时候,就会自动触发 __get
这些都是系统替你做的。
展开全部
没事,有个学习顿悟的过程,坚持下去。
面向对象编程中,类是对象的代码定义,类没有实例化的时候,也就是没有new的时候,是没有对象的。当new 一个对象的时候,new 其实调用的就是构造函数来生成对象的。可以定义多个构造函数供new时调用,来生成不同的对象。所有OO的编程语言,都是这个原理。,get/set 就是访问(获取)对象属性/设置对象属性的接口。你疑惑都是修改,为啥用这个,其实你要记得,比如你定义一个public 的 整型变量。对象生成后,它是可以被外界访问和修改的。但我只想读取它,而不能修改它,怎么办?get only 即可。
面向对象编程中,类是对象的代码定义,类没有实例化的时候,也就是没有new的时候,是没有对象的。当new 一个对象的时候,new 其实调用的就是构造函数来生成对象的。可以定义多个构造函数供new时调用,来生成不同的对象。所有OO的编程语言,都是这个原理。,get/set 就是访问(获取)对象属性/设置对象属性的接口。你疑惑都是修改,为啥用这个,其实你要记得,比如你定义一个public 的 整型变量。对象生成后,它是可以被外界访问和修改的。但我只想读取它,而不能修改它,怎么办?get only 即可。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
直接修改 任何人都能修改,那样的程序安全性为0,间接修改,你可以通过方法控制变量值的范围。比如说,一个人的年龄,你如果直接修改,他给你该成负数就没意义了。你通过了__set()方法,你可以控制年龄的范围,不在范围内的,不予修改。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询