24
回答
PHP的面向对象问题
终于搞明白,存储TCO原来是这样算的>>>   
 <?php
class db{
    public $var;
    public function connect()
    {
    $this->var=5;
        echo $this->var2;
    }
}
class Mysql extends db{
    public $var2;
    public function __construct()
    {
    $this->var2=8;
    }
    public function connect()
    {
    parent::connect();
    }
}
$db = new Mysql();
$db->connect();
?> 
大家猜运行结果是多少?需要对$this和PHP的OOP理解很深
PHP
举报
walden
发帖于5年前 24回/1K+阅
共有24个答案 最后回答: 5年前
在这给你补充:“为什么从父类访问到了子类的属性”,这句话本身是有错的,$this的访问过程不是在类中进行的,而是在对象中进行的;类成员的访问,只限于“静态属性”,“静态方法”,“类常量”三种。打个比分,类,是一个模板;而$db对象是从模板里倒出的模型。$this是$db的引用,$db上面有个public成员属性$var2
--- 共有 3 条评论 ---
-0.0-你们写的我肿么都看不懂,汗,太新手、太简单 5年前 回复
朱__朱回复 @那些年,我们一起 : Mysql类里的$var2是一个定义,不是一个属性,它决定了由此定义而生的对象实例中名为$var2的可见性和初始值。如果要访问一个叫$var2的成员,必须到拥有$var2成员的实例中去访问。你不能说:我要去访问类中的一个定义。你可以说,我要访问一个对象的成员,这个属性的可见性和初始值是在mysql类中定义的。 5年前 回复
那些年我们一起你是说Mysql类里的var2是属于db类的对象?? 5年前 回复
class db{
    var $var;
    public function connect()
    {
		$this->var=5;
        //echo $this->var;
    }
}
class Mysql extends db{
    private $var;
    public function __construct()
    {
    $this->var=8;
    }
    public function connect()
    {
        echo $this->var;
        parent::connect();
        echo $this->var;
    }
}
$db = new Mysql();
$db->connect();

看下这个代码你就懂了
--- 共有 1 条评论 ---
walden如果父类的属性权限为public 在子类中无法定义一个与之同名并且权限降低的属性 编译器会报 Cannot reduce access level for field 'xxx' 5年前 回复
毫无疑问是8.......但是如果你认为答案是5,那我可以确定你db类里把var2打错成了var.......
--- 共有 1 条评论 ---
walden是8 但是为什么呢 父类的$this能访问子类的域 5年前 回复

引用来自“$_$”的答案

毫无疑问是8.......但是如果你认为答案是5,那我可以确定你db类里把var2打错成了var.......
+100000000000000000000000000000000000086
晕,楼主贴错了吧,这毫无难度啊。把var2改成var还能绕住一些新手。
--- 共有 7 条评论 ---
walden回复 @朱亚杰 : 谢谢了 5年前 回复
朱__朱回复 @华定平 : $this是一个引用变量,对不对?如果一个引用变量除了能指向一个对象,还能指向另一个不明物体,那这个引用属于什么类型,目前任何一种语言都没有说一个变量可以指向两个目标。我在下面再给你解释一下pretected和private,你稍等,这贴看来得收费了.... 5年前 回复
walden回复 @朱亚杰 : $var2定义为private $db->connect()是访问不到的 因为他访问的是父类的方法 如果$this真的指向自身Mysql类的空间 那为何$var2定义为私有 就访问不到?说明$this不但是指向某个对象 而且这个指针还有自己的作用范围 就像C++里的指针类型一样 5年前 回复
朱__朱回复 @华定平 : 你仔细领会我刚才的回复,都给你用引号把重点扩起来了.....再给你标注一下:$this指向的是“对象”,“不是类”。“$var2是属于$db对象”,不属于mysql类.......既然$var2属于$db,$this指向$db,$var2又定义了公开,于是,就这样访问到了$var2。字数限制,再下面我再补充吧。 5年前 回复
walden回复 @朱亚杰 : 你真的对你自己所拥有的知识这么自信吗?你把class Mysql的$var 属性改为 private试试 看编译器会报什么 如果$var2真的属于class Mysql 那么$this是在何种情况都能访问到$var2的 不知道你有没有了解过C++的指针 指针的类型不同 所能访问的域是不同的 $this也一样 他也有它自己的类型 5年前 回复

主要原因是PHP可以不声明直接使用变量吧

 public function connect()

05     {
06     $this->var=5;
07

        echo $this->var2;

关键字有很多,作用就一个:定义。你理解成 规定也许更容易。这里说private和protected,他们就是两项法律:规定了类的实例(即对象)的成员的访问权限。如果Mysql类中$var2的定义为private,就等于规定了 “只有Mysql类中定义的成员有权访问这个成员”,而 db类中的connect方法,不是在mysql类中定义的,所以它的访问会被拒绝,php会报告这个错误给你。
--- 共有 6 条评论 ---
步惊云这里是个权限访问控制,在子类中声明为public或protected的父类是能够访问的, 5年前 回复
朱__朱回复 @华定平 : 访问的是db类中的connect方法,不表示就必须从db类的实例中获取数据,因为对象里面没有保存方法只保存属性,在对象中调用方法是去内存的代码区找到方法代码进行执行。所以无需db类的实例,照执行不误啦。对象所以始终都是那个$db对象木有变化,所以$db对象中的$var2就被echo出来了。 5年前 回复
walden回复 @朱亚杰 : 找这么说 访问的是父类的connect 那$this应该指向的是$db的实例空间才对 5年前 回复
walden回复 @那些年,我们一起 : 你的疑惑也是我的疑惑 其实 5年前 回复
朱__朱回复 @那些年,我们一起 : 恩,是的。你只要记住两点,基本上就不会出错了。第一点最重要,记住$this是对象,不是类;第二点:$this指向的对象是当前访问的“入口对象”,一个很复杂很长的访问过程,可能会经过很多个对象,$this指向““这个阶段的访问””的""入口对象""。 5年前 回复

引用来自“朱亚杰”的答案

关键字有很多,作用就一个:定义。你理解成 规定也许更容易。这里说private和protected,他们就是两项法律:规定了类的实例(即对象)的成员的访问权限。如果Mysql类中$var2的定义为private,就等于规定了 “只有Mysql类中定义的成员有权访问这个成员”,而 db类中的connect方法,不是在mysql类中定义的,所以它的访问会被拒绝,php会报告这个错误给你。
这段话 是你自己总结的  还是从哪里摘抄的呢 我要看原文
我还以为我算错了,原来真的是8。。。有什么问题吗?。。。
--- 共有 3 条评论 ---
walden回复 @mahone : 嗯 必须看评论 才能理解这些代码 以及我的疑惑 哈哈哈 谢谢各位啊 5年前 回复
mahone仔细看了下评论,理解了lz的意思。。。 你把这个代码,翻译成java,c++去试试。。。你会发现,c++和java的结果不一样。java应该和php一样,这可能就是你的疑问。 5年前 回复
朱__朱哈没什么问题,楼主提问方式确实容易吓到人.... 5年前 回复
顶部