PHP面向对象编程:能否在不同类中使用相同属性?
关于PHP多类复用公共属性的问题解答
嘿,作为PHP OOP新手,你的问题非常典型——很多刚接触面向对象的开发者都会疑惑类之间的属性复用问题。先直接说结论:可以复用,但你的示例代码存在语法错误,没法直接运行,我来一步步帮你梳理清楚。
先修正你代码里的明显错误
你的check类写法有问题:
- 类内部不能直接写执行代码(比如
$obj = new check;),所有逻辑必须放在方法里(比如__construct构造函数或者自定义方法) new check会导致递归实例化自己,这会直接报错,你应该实例化的是bank类- 公共属性的访问需要通过实例对象来操作
三种实现多类复用bank属性的方法
1. 直接在其他类中实例化Bank类
因为bank的属性都是public(公共)的,所以你可以在check或save类中直接创建bank的实例,然后访问这些属性。
修正后的示例代码:
<?php class Bank { public $holders_firstName = "Aadil"; public $holders_lastName = "Hafesji"; public $holders_currentNumber = 456789111; public $holders_aaCode = "20-55-66"; public $holders_b = "£8"; } class Check { public function getBankInfo() { $bankObj = new Bank(); // 直接访问Bank类的公共属性 echo $bankObj->holders_firstName; // 输出: Aadil } } class Save { public function showBalance() { $bankObj = new Bank(); echo $bankObj->holders_b; // 输出: £8 } } // 调用测试 $check = new Check(); $check->getBankInfo(); $save = new Save(); $save->showBalance(); ?>
2. 通过继承(Inheritance)复用属性
如果Check和Save类本身和Bank类有明确的"is-a"关系(比如它们是Bank的不同业务子类),可以通过继承Bank类来直接复用它的公共属性。
示例代码:
<?php class Bank { public $holders_firstName = "Aadil"; public $holders_lastName = "Hafesji"; public $holders_currentNumber = 456789111; public $holders_aaCode = "20-55-66"; public $holders_b = "£8"; } // 继承Bank类,自动获得所有公共属性 class Check extends Bank { public function printHolderName() { // 直接使用父类的属性,不需要实例化 echo $this->holders_firstName . " " . $this->holders_lastName; // 输出: Aadil Hafesji } } class Save extends Bank { public function printAccountNumber() { echo $this->holders_currentNumber; // 输出: 456789111 } } // 调用测试 $check = new Check(); $check->printHolderName(); $save = new Save(); $save->printAccountNumber(); ?>
3. 依赖注入(Dependency Injection)
如果Check或Save类需要依赖Bank的实例(而不是每次都新建),可以通过构造函数或方法传入Bank对象,这种方式更灵活,也符合面向对象的解耦原则。
示例代码:
<?php class Bank { public $holders_firstName = "Aadil"; public $holders_lastName = "Hafesji"; public $holders_currentNumber = 456789111; public $holders_aaCode = "20-55-66"; public $holders_b = "£8"; } class Check { private $bank; // 构造函数注入Bank实例 public function __construct(Bank $bank) { $this->bank = $bank; } public function getFirstName() { echo $this->bank->holders_firstName; } } class Save { private $bank; // 方法注入Bank实例 public function setBank(Bank $bank) { $this->bank = $bank; } public function getBalance() { echo $this->bank->holders_b; } } // 调用测试 $bank = new Bank(); $check = new Check($bank); $check->getFirstName(); // 输出: Aadil $save = new Save(); $save->setBank($bank); $save->getBalance(); // 输出: £8 ?>
总结一下哪种方式适合你
- 如果只是偶尔需要访问
Bank的属性,用直接实例化的方式最简单 - 如果
Check/Save是Bank的子类(比如不同类型的账户),用继承最合理 - 如果你的项目更复杂,需要灵活管理依赖关系,依赖注入是更专业的选择
内容的提问来源于stack exchange,提问作者Aadil Hafesji
相关产品推荐
相关产品推荐

