You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:41:37