网站模板库
  • 首页
  • web前端工具
    • HTML/JS转换工具
    • JS/HTML格式化工具
    • 字母/英文大小写转换工具
    • robots.txt文件生成工具
    • Js压缩/格式化工具
    • Css在线压缩工具_代码格式化
  • 关于我们
    • 免责声明
    • 联系我们
    • 广告服务
    • 服务项目
    • 关于我们
    • 网站轮播
    • 公告
    • 成都优优科技专用
    • 按行业分类
  • web学院
    • 服务器教程
    • 学习资料
      • 基础书籍
      • 交互书籍
      • 入门教程
      • 特效分类
    • 案例分享
    • web资讯
  • 网页特效
    • 图片特效
    • 导航特效
    • 滑动按钮
    • 表单特效
    • 文字特效
    • 弹窗特效
    • 其他特效
  • 织梦模板
    • 科技/电子/数码/通信
    • 文化/艺术/广告/传媒
    • 装修/设计/家居/家具
    • 基建/施工/地产/物业
    • 餐饮/酒店/旅游/票务
    • 食品/果蔬/饮料/日用
    • 服饰/珠宝/礼品/玩具
    • 摄影/婚庆/家政/生活
    • 运动/健身/体育/器材
    • 学校/教育/培训/科研
    • 美容/保健/医院/医疗
    • 金融/财税/咨询/法律
    • 政府/组织/集团/协会
    • 汽车/物流/交通/搬运
    • 机械/设备/制造/仪器
    • 化工/环保/能源/材料
    • 农业/畜牧/养殖/宠物
    • 其他模版
    • IT/软件/信息/互联网
  • 手机模板
    • 手机APP模板
    • 微信小程序模板
    • wap
  • 网站模板
    • joomla模板
    • Drupal模板
    • z-blog模板
    • EyouCms模板
    • Bootstrap模板
    • 帝国cms模板
    • CmsEasy模板
    • MetInfo模板
    • 购物商城模板
      • Shopify主题
      • PrestaShop主题
    • 后台模板
    • 纯HTML模板
    • ecshop模板
    • phpwind模板
    • pbootcms模板
    • phpcms模板
    • wordpress模板
    • discuz模板
  • 教程
    • 织梦教程
    • Discuz教程
    • WordPress教程
    • Phpcms教程
    • Phpwind教程
    • ECShop教程
    • Joomla教程
    • Drupal教程
    • zblog教程
    • EyouCMS教程
    • 帝国cms教程
    • MetInfo教程
    • CmsEasy教程
登录
当前位置:网站模板库 > web学院 > 案例分享 > php 中 static 属性和方法的继承问题
admin 案例分享 2023-06-24 15:31:54

php 中 static 属性和方法的继承问题

php 中 static 属性和方法的继承问题,第1张

php 中 static 属性和方法的继承问题,第2张

网上关于静态属性和方法的继承问题,答案千奇百怪,干脆直接代码试了下:

class Base
{
    public static $var = 'var';

    public static function testStaticFun()
    {
        echo 'func';
    }
}

class A extends Base
{
    public function testSelf()
    {
        echo self::$var;
    }

    public function testParent()
    {
        echo parent::$var;
    }

    public function setSelf()
    {
        self::$var = 'self';
    }

    public function setParent()
    {
        parent::$var = 'parent';
    }

    public static function testStaticFun()
    {
        parent::testStaticFun();
        echo 'over';
    }
}

$objA = new A();     
  
$objA->testSelf();    // var
$objA->testParent();  // var

$objA->setSelf();
$objA->testSelf();    // self
$objA->testParent();  // self
echo Base::$var;      // self

$objA->setParent();
$objA->testSelf();    // parent
$objA->testParent();  // parent
echo Base::$var;      // parent

Base::testStaticFun();    // func
A::testStaticFun();       // func over

所以 php 中静态的继承究竟是什么情况?是不是和其他语言比如 java 在静态继承的行为上有区别?继承实现的原理是什么?

其实遇到这个问题主要是因为解决 model 引用数据库驱动的问题,因为一个业务逻辑下来 model 可能被 new 很多出来(不同的 model ),本来是在 model 基类里的 __construct 调用 DBFactory 工厂类的静态方法返回一个唯一的驱动对象的(比如: DBFactory::getDriverInstance('pdo'))。

但是感觉多此一举,于是想抛掉这个工厂类,直接让 model 基类来做这个事情,这时候就遇到上面的问题了,如果不用静态直接 model 基类的 __construct new 一个比如 Pdo 对象,虽然 UserModel/PostModel 全局只会有一个,但这两个模型对象都会持有一个 Pdo 对象,并且不是同一个。

于是想到 model 基类里放一个 static $dbInstance , model 的 __construct 负责给这个属性赋值,如果说继承类是用的同一个 $dbInstance ,那么我的目标就可以实现了?

还是说干脆写一个类似 thinkphp 的 M() 方法,只不过我叫 DB(),主要是为了获取数据库驱动对象的,方法里内置 static 变量,这样是 100% 可以的,并且还能通过接收参数临时切换驱动(业务里遇到过 mysql 切 mongo 的场景)。

但是既然也到静态继承的问题,就想搞个明白!请前辈指教!

----------------------- 以下是精选回复-----------------------

答:PHP 的静态类型基本上可以理解为没有继承继承行为,静态属性该类的所有实例共用的。子类除非调用 parent 必须要用 parent ,否则修改就是自身的属性,不会影响父类的属性。如果父类方法中需要修改的是子类的静态属性,要用 static 关键字,而不要用 self , self 只会修改自身的属性,不会影响子类的属性。
答:你的方法是可行的,但是不建议这么做。
答:可以看看手册
http://php.net/manual/en/language.oop5.late-static-bindings.php
答:没见过静态成员参与继承。从生活习惯上也不符合习惯。继承的好处就是,可以通过派生类的一个实例的引用来访问基类成员。

而静态成员本来就可以用过类名直接访问。何须通过继承来多此一举。

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » php 中 static 属性和方法的继承问题

admin 钻石

分享到:
上一篇
日志服务器用 ELK 还是 Graylog2 好?
下一篇
作为公司 Java 开发岗,交接服务器,有什么要叮嘱的么..

相关推荐

sqlalchemy 请教

sqlalchemy 请教

PHP GUI 开发方案:利用 PHP 7.4 在激活 FFI 的情况下使用 libui 进行 GUI 程序开发

PHP GUI 开发方案:利用 PHP 7.4 在激活 FFI 的情况下使用 libui 进行 GUI 程序开发

学数据分析一个月了, Excel 和 sql 学完了,能找到数据分析相关工作吗?统招大专, 30 岁,文科。。。。

学数据分析一个月了, Excel 和 sql 学完了,能找到数据分析相关工作吗?统招大专, 30 岁,文科。。。。

[悬赏 50] 如何用 PHP 抠图

[悬赏 50] 如何用 PHP 抠图

0条评论

发表评论 取消回复

要发表评论,您必须先登录。

提供最优质的资源集合

立即查看 了解详情
网站模板库

主题/付费下载/查看/余额管理/自定义积分,集成支付,卡密,推广奖励等。

本站导航
  • 链接标题
友情链接
  • 链接标题
快速搜索
本站由钛宇宙强力驱动
友情链接:
    商业源码网蜀ICP备2023005044号
    网站模板库
    • 登录
    • 注册
    网站模板库
    • 首页
    • web前端工具►
      • HTML/JS转换工具
      • JS/HTML格式化工具
      • 字母/英文大小写转换工具
      • robots.txt文件生成工具
      • Js压缩/格式化工具
      • Css在线压缩工具_代码格式化
    • 关于我们►
      • 免责声明
      • 联系我们
      • 广告服务
      • 服务项目
      • 关于我们
      • 网站轮播
      • 公告
      • 成都优优科技专用
      • 按行业分类
    • web学院►
      • 服务器教程
      • 学习资料►
        • 基础书籍
        • 交互书籍
        • 入门教程
        • 特效分类
      • 案例分享
      • web资讯
    • 网页特效►
      • 图片特效
      • 导航特效
      • 滑动按钮
      • 表单特效
      • 文字特效
      • 弹窗特效
      • 其他特效
    • 织梦模板►
      • 科技/电子/数码/通信
      • 文化/艺术/广告/传媒
      • 装修/设计/家居/家具
      • 基建/施工/地产/物业
      • 餐饮/酒店/旅游/票务
      • 食品/果蔬/饮料/日用
      • 服饰/珠宝/礼品/玩具
      • 摄影/婚庆/家政/生活
      • 运动/健身/体育/器材
      • 学校/教育/培训/科研
      • 美容/保健/医院/医疗
      • 金融/财税/咨询/法律
      • 政府/组织/集团/协会
      • 汽车/物流/交通/搬运
      • 机械/设备/制造/仪器
      • 化工/环保/能源/材料
      • 农业/畜牧/养殖/宠物
      • 其他模版
      • IT/软件/信息/互联网
    • 手机模板►
      • 手机APP模板
      • 微信小程序模板
      • wap
    • 网站模板►
      • joomla模板
      • Drupal模板
      • z-blog模板
      • EyouCms模板
      • Bootstrap模板
      • 帝国cms模板
      • CmsEasy模板
      • MetInfo模板
      • 购物商城模板►
        • Shopify主题
        • PrestaShop主题
      • 后台模板
      • 纯HTML模板
      • ecshop模板
      • phpwind模板
      • pbootcms模板
      • phpcms模板
      • wordpress模板
      • discuz模板
    • 教程►
      • 织梦教程
      • Discuz教程
      • WordPress教程
      • Phpcms教程
      • Phpwind教程
      • ECShop教程
      • Joomla教程
      • Drupal教程
      • zblog教程
      • EyouCMS教程
      • 帝国cms教程
      • MetInfo教程
      • CmsEasy教程

      弹窗标题

      这是一条网站公告,可在后台开启或关闭,可自定义背景颜色,标题,内容,用户首次打开关闭后不再重复弹出,此处可使用html标签...