php面向对象调用属性和方法的一点疑问? (->和::和$this和$self)

<?php
class Person {
    // var $name;
    // var $sex;
    // var $age;

    function __construct($name='', $sex='男', $age=1)
    {
        $this->name = $name;
        $this->sex = $sex;
        $this->age = $age;
    }
    function say(){
        echo "我的名字:" .$this->name. ", 性别: ".$this->sex. ", 年龄:" .$this->age;
    }
}
    $person1 = new Person('张三', '女', 20);
    $person1->say();

问题如下:

  1. 当构造函数里面的三个变量存在(不被注释掉时)var $name; var $sex; var $age;, 实例化对象后调用对象能正常输出. 这个很好理解, 在对象内部, 方位对象属性, 使用$this.
  2. 但是删除或注释掉构造函数里面的三个变量后, 这段代码还能正常输出.
    很纳闷, 删掉之后, 这个类里面不是没有对象属性了吗? 为什么构造方法内还能使用$this进行访问呢?
好像有点明白了.之前看的视频, 自己把$this, $self 和 ->, :: 都看成一种访问对象成员的方式和符号.
实际上, $this和$self 是用来指代对象名称的.

在对象内部访问对象属性时, 在实例化对象之前, 还不知道对确切的对象名, 所以就设计了"$this"这个关键词.

等到之后在对象外部实例化出来的对象名称是啥, $this就指代啥.

刚学到php面向对象, 很多不懂, 不知道这里的理解是否有偏差, 恳请大家指正和帮忙. 谢谢了.

阅读 2.2k
1 个回答

php可以动态读写属性(你说的变量,那个叫属性),不定义也可以,但是不推荐这么用。

然后var 定义写法也不推荐用了,非常古老。建议使用public/private/protected

$this是针对new出来的对象

static::self::是无需实例化new就可以用

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题