面向对象 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 协议》,转载必须注明作者和本文链接