面向对象 7问7答

@_小小怪下士

  1. 面向对象的权限修饰符,以及每个修饰符的含义:
    • public: 成员在任何地方都可以被访问。
    • protected: 成员在其自身类和其子类中可访问。
    • private: 成员只能在其定义的类内部访问。
  1. 面向对象的三大特征:

    • 封装 (Encapsulation): 将数据和操作数据的方法绑定在一起,对外部隐藏对象的内部实现细节。
    • 继承 (Inheritance): 允许一个类继承另一个类的属性和方法,使得代码重用更加容易实现。
    • 多态 (Polymorphism): 同一种操作作用于不同的对象,产生不同的行为结果
  2. 对象是由那些成分组成的:

    • 属性 (Attributes/Fields): 数据成员,代表对象的特征。
    • 方法 (Methods/Functions): 行为成员,代表对象能够执行的操作。
      构造方法 (Constructor): 初始化对象的方法。
      析构方法 (Destructor): 在对象销毁时执行的方法。
      其他特殊方法 (Magic methods): 提供对对象的特殊操作,如toString、clone等。
  3. 判断下列代码是否正确:

    class Person
    {
        private $salary = 10;
    }
    
    $obj = new Person;
    echo $obj->salary;

    错误:
    在这个代码中,$salary是私有属性,无法直接在外部访问。应该使用公共方法来获取私有属性的值。

  4. 列举下面代码的错误:

    class Person
    {
        private $salary = 10;
    }
    
    class Man extends Person
    {
        private function getParentSalary()
        {
            return $this->salary;
        }
    }
    
    $obj = new Man;
    echo $obj->getParentSalary();

    错误:

    1. 子类无法直接访问父类的私有属性 $salary,会导致错误。
    2. 外部无法调用私有方法
  5. 列举下面代码的错误:

    class Person
    {
        public $name; // 姓名
        protected $age; // 年龄
        private $salary; // 工资
    }
    
    class Man extends Person
    {
        public function getParentName()
        {
            return $this->name;
        }
    
        public function getParentSalary()
        {
            return $this->salary;
        }
    
        protected function getParentAge()
        {
            return $this->salary;
        }
    }
    
    $obj = new Man;
    echo $obj->getParentName();
    echo $obj->getParentSalary();
    echo $obj->getParentAge();

    错误:

    1. getParentSalary中,子类无法直接访问父类的私有属性 $salary
    2. getParentAge是protected方法,外部无法调用

    子类可以调用父类protected方法&属性:$age

  6. 魔术方法的说明和代码触发:

    • __construct: 构造方法,在创建对象时调用。
      $obj = new MyClass(); // 触发 __construct
    • __destruct: 析构方法,在对象销毁时调用。
      unset($obj); // 触发 __destruct
    • __get: 在读取不可访问属性时调用。
      $value = $obj->undefinedProperty; // 触发 __get
    • __set: 在给不可访问属性赋值时调用。
      $obj->undefinedProperty = 'value'; // 触发 __set
    • __isset: 在对不可访问属性调用 isset()empty() 时调用。
      isset($obj->undefinedProperty); // 触发 __isset
    • __unset: 在对不可访问属性调用 unset() 时调用。
      unset($obj->undefinedProperty); // 触发 __unset
    • __call: 在调用不可访问方法时调用。
      $obj->undefinedMethod(); // 触发 __call
    • __callStatic: 在调用不可访问的静态方法时调用。
      MyClass::undefinedStaticMethod(); // 触发 __callStatic
    • __toString: 在对象被当作字符串时调用。
      echo $obj; // 触发 __toString
    • __invoke: 在尝试调用一个对象时调用。
      $obj(); // 触发 __invoke
    • __clone: 在对象复制时调用。
      $newObj = clone $obj; // 触发 __clone
    • __sleep__wakeup: 在对象被序列化和反序列化时调用。
      serialize($obj); // 触发 __sleep
      unserialize($serializedData); // 触发 __wakeup
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!