您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

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

2024/10/13 20:40:28发布21次查看
网上关于静态属性和方法的继承问题,答案千奇百怪,干脆直接代码试了下:
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(); // selfecho base::$var; // self$obja->setparent();$obja->testself(); // parent$obja->testparent(); // parentecho base::$var; // parentbase::teststaticfun(); // funca::teststaticfun(); // func over

所以 php 中静态的继承究竟是什么情况?是不是和其他语言比如 java 在静态继承的行为上有区别?父类的静态属性和方法会不会被覆盖?继承之后静态属性是不是只有一份?继承实现的原理是什么?
回复内容: 网上关于静态属性和方法的继承问题,答案千奇百怪,干脆直接代码试了下:
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(); // selfecho base::$var; // self$obja->setparent();$obja->testself(); // parent$obja->testparent(); // parentecho base::$var; // parentbase::teststaticfun(); // funca::teststaticfun(); // func over

所以 php 中静态的继承究竟是什么情况?是不是和其他语言比如 java 在静态继承的行为上有区别?父类的静态属性和方法会不会被覆盖?继承之后静态属性是不是只有一份?继承实现的原理是什么?
分成几点说吧:
1.静态成员可以使用 访问控制关键字修饰,可以被继承和重写
也就就说子类可以继承到父类的静态变量、方法...遵循“关键字”规则
2.如果子类没有重写,那么子类调用的实际是父类的静态方法
这个也很简单明了,继承的基本规则,没什么好解释的
3.静态成员持有者是类不是对象,所以类的多个实例共享同一个静态属性的,在一个实例中修改静态属性会影响到另一个实例中的静态属性
这个就是重点了,好好理解下,单列模式也是利用这个特性。
所以代码中 self::$var 和 parent::$var 其实指向的都是父类中的$var!
最后举个栗子:
单例模式下,$var你可以理解为数据库连接,父类生成一个连接后,继承的子类直接使用这个连接即可连接使用数据库。
但是如果子类自己生成一个连接$var,那么使用的时候就要区分是self::$var还是parent::$var,因为俩个值可能不一样,连接的数据库也不一样。万一是主从呢。哈哈。
happy coding~
此类问题我在这里已经回答过好几遍了,比如这个。你看下就明白了。
没错,静态属性只有一份!
所以使用静态属性写单例模式的时候一定要小心又小心。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product