面向对象 7问7答
- 面向对象的权限修饰符,以及每个修饰符的含义:
public: 成员在任何地方都可以被访问。protected: 成员在其自身类和其子类中可访问。private: 成员只能在其定义的类内部访问。
面向对象的三大特征:
- 封装 (Encapsulation): 将数据和操作数据的方法绑定在一起,对外部隐藏对象的内部实现细节。
- 继承 (Inheritance): 允许一个类继承另一个类的属性和方法,使得代码重用更加容易实现。
- 多态 (Polymorphism): 同一种操作作用于不同的对象,产生不同的行为结果
对象是由那些成分组成的:
- 属性 (Attributes/Fields): 数据成员,代表对象的特征。
- 方法 (Methods/Functions): 行为成员,代表对象能够执行的操作。
构造方法 (Constructor): 初始化对象的方法。
析构方法 (Destructor): 在对象销毁时执行的方法。
其他特殊方法 (Magic methods): 提供对对象的特殊操作,如toString、clone等。
判断下列代码是否正确:
class Person { private $salary = 10; } $obj = new Person; echo $obj->salary;错误:
在这个代码中,$salary是私有属性,无法直接在外部访问。应该使用公共方法来获取私有属性的值。列举下面代码的错误:
class Person { private $salary = 10; } class Man extends Person { private function getParentSalary() { return $this->salary; } } $obj = new Man; echo $obj->getParentSalary();错误:
- 子类无法直接访问父类的私有属性
$salary,会导致错误。 - 外部无法调用私有方法
- 子类无法直接访问父类的私有属性
列举下面代码的错误:
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();错误:
getParentSalary中,子类无法直接访问父类的私有属性$salary。- getParentAge是protected方法,外部无法调用
子类可以调用父类protected方法&属性:$age
魔术方法的说明和代码触发:
__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 协议》,转载必须注明作者和本文链接
关于 LearnKu
推荐文章: