网站模板库
  • 首页
  • 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 开发岗,交接服务器,有什么要叮嘱的么..

相关推荐

python多线程任务冲突

python多线程任务冲突

新写了个后台程序,自动给知乎新关注者发私信,要不要来试试看?

新写了个后台程序,自动给知乎新关注者发私信,要不要来试试看?

Google App Engine 开始支持 PHP

Google App Engine 开始支持 PHP

PyCon China 2011的视频

PyCon China 2011的视频

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标签...