搜尋
首頁後端開發php教程谈谈PHP继承的那些事,我的个人见解,php继承那些事见解_PHP教程

谈谈PHP继承的那些事,我的个人见解,php继承那些事见解

  网上经常流传出php是语言鄙视链最低端的那个,曾经大学学java,毕设用java,刚出来培训用java的我,在最初工作的2、3年时对php的面向对象也是颇有意见,总觉得【不伦不类】,更别提对js的看法了。但是这些观点都在经历越来越多的项目之后逐渐的淡化,甚至改观。这里面包含着自己对项目、技术有着更多的理解,同时,在这些年里,Web环境、技术也在不停的更新。不过今天不是来聊这些东西的,对于以上的问题,我的观点可以总结为:技术是工具、手段,不合适就升级、换,就这么简单。

  话归原题。虽然写php已经是将近8年的功底了,但因为工作关系,经常需要涉及前后端的各种代码,容易精分,也总会记岔。最近发生的一件事情让我觉得,或许写下来能够让自己清醒一点。

  在某一年写某个模块时用到了static成员,在实现子类的过程中发现他们也共享着父类这个成员的值,具体来说就是我在某个子类A中改变了那个成员值,在另外一个子类B使用的时候结果意外的得到了A覆盖后的值。当时以为,原来static成员是在从声明的地方开始的整个类别树中共享的。后来一直隐约记得这个结论,在平常的代码里面更谨慎的使用static成员,除非确认写的类是个独立的工具类,不然不轻易使用static。

  直到有一天我的老大跟我商量升级我之前写的一个BaseModel,他无意中问我:好像你不喜欢用static成员?我说没有啊,因为考虑到BaseModel会被经常继承成各种Model,如果我在这里用了static的话,将来容易踩坑。他表示不理解,然后过来与我辩论。我很义正言辞的说明了因为static成员会被共享,如果要调用两个不同的子类的时候,那个static成员的变量的值就会像一个全局变量一样不可控。他不同意。于是本着科学的精神,我们写下了一个简短的代码来验证:

  class A {

  protected static $var1 = null;

  public static function test(){

  echo get_called_class()。' '.static::$var1.'
';

  }

  }

  class B extends A {

  protected static $var1 = 'b';

  }

  class C extends A {

  protected static $var1 = 'c';

  }

  B::test();

  C::test();

  很显然,这次是我败了。 我期待的结果是c c,不过其实是b c。 那么这样看起来其实子类的static成员是只在子类这一层共享的。但是我总觉得不对劲,明明在写BaseModel的时候我已经又栽过跟头了,为什么这个验证出来并不支持我那个时候遇到的问题呢?于是我发现我记岔了。年轻多好。后来想起来,原来我这里不用static的原因仅仅是因为设计需要。

  我以为我错了。直到前几天又写了几个父子类(不是BaseModel了),大胆的用上了static成员,结果是轰轰烈烈的在自测中又摔了一跤。怎么回事!然后我仔细留意了一下自己这次的用法,将上面的例子改了一下运行:

  class A {

  protected static $var1 = null;

  protected static $var2 = null;

  public static function test(){

  if(!static::$var2){

  static::$var2 = static::$var1;

  }

  echo get_called_class()。' '.static::$var1.'
';

  }

  }

  class B extends A {

  protected static $var1 = 'b';

  }

  class C extends A {

  protected static $var1 = 'c';

  }

  B::test();

  C::test();

  结果是

  B b

  C b

  如果说上次的结论是对了,那么这次又怎么解释?这里明明就是表示$var2是A,B,C共享的。$var1和$var2的差别这样看起来仅仅是有声明和没声明的区别。于是我又改成这样:

  class A {

  protected static $var1 = null;

  protected static $var2 = null;

  public static function test(){

  if(!static::$var2){

  static::$var2 = static::$var1;

  }

  echo get_called_class()。' '.static::$var1.'
';

  }

  }

  class B extends A {

  protected static $var1 = 'b';

  protected static $var2 = null;

  }

  class C extends A {

  protected static $var1 = 'c';

  protected static $var2 = null;

  }

  B::test();

  C::test();

  结果是

  B b

  C c

  我当时内心是崩溃的。于是我上了Stack Overflow,发现栽坑的不止我一个。

  只有显式的声明出来的static成员才会被视为是只从属于子类的。

  只有显式的声明出来的static成员才会被视为是只从属于子类的。

  只有显式的声明出来的static成员才会被视为是只从属于子类的。

  重要的事情说三遍!不过如果子类很多的话, 动态决定值的成员 每个都这样去声明,就从写代码这件事上失去了用static的意义。一个更好的方法是,把$var2变成一个数组,每个类要用的值放在$var[__CLASS__]里面使用。

  不过不管怎么说,如非必要,还是尽量不用static成员继承吧。

  还有一个有点类似的“坑”。我们说到private成员的时候,都知道private是指私有的,不会被子类继承。但是有时候写代码的时候会忘记,直到载跟头了才想起来原来是private导致子类找不到该有的成员,或者说是private都在子类声明了,但是因为调用函数时是调用父类函数,结果得到的是父类这个private的值而不是子类的。遇到这种情况不可能又将函数原样的重写在子类里。所以使用private要特别小心。

  曾经在使用Rackspace的SDK的时候就看到有些类里面使用了private成员,但是由于他们给出了不必要的打开文件权限,导致代码在我们的服务器上运行不了。那么这个时候本想写个子类覆盖一下这个成员的初始值就好了,结果就因为这是个private成员,而最后需要把所有引用到的地方都拷到自己写的子类里面。为什么我们不直接改SDK,让成员变成protected?因为开发包也许下次就升级了呢?修正之后我们把子类移除就好了。如果修改库代码成了习惯,想升级的时候就没这么欢了。所以说,private成员的使用一定要慎之又慎,如果你也在开发SDK,就更需要考虑使用者是不是需要继承?如果你必须写private,你是不是能够保证代码能够适应各种场景的使用?

  除非你有非常充分的理由,static和private都是需要慎重使用的。

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1138823.htmlTechArticle谈谈PHP继承的那些事,我的个人见解,php继承那些事见解 网上经常流传出php是语言鄙视链最低端的那个,曾经大学学java,毕设用java,刚出...
陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
phpcms是什么框架phpcms是什么框架Apr 20, 2024 pm 10:51 PM

PHP CMS 是一种基于 PHP 的开源内容管理系统,用于管理网站内容,其特点包括易用性、强大功能、可扩展性、安全性高和免费开源。它可以节省时间、提升网站质量、增强协作并降低开发成本,广泛应用于新闻网站、博客、企业网站、电子商务网站和社区论坛等各种网站。

phpcms怎么跳转到详情页phpcms怎么跳转到详情页Jul 27, 2023 pm 05:23 PM

phpcms跳转到详情页方法:1、使用header函数来生成跳转链接;2、循环遍历内容列表;3、获取内容的标题和详情页链接;4、生成跳转链接即可。

微信登录集成指南:PHPCMS实战微信登录集成指南:PHPCMS实战Mar 29, 2024 am 09:18 AM

标题:微信登录集成指南:PHPCMS实战在今天的互联网时代,社交化登录已经成为网站必备的功能之一。微信作为国内最流行的社交平台之一,其登录功能也被越来越多的网站所采用。本文将介绍如何在PHPCMS网站中集成微信登录功能,并提供具体的代码示例。第一步:注册微信开放平台账号首先,我们需要在微信开放平台上注册一个开发者账号,申请相应的开发权限。登录[微信开放平台]

phpcms是什么意思phpcms是什么意思Apr 20, 2024 pm 10:39 PM

PHPCMS 是一款免费开源的内容管理系统 (CMS),特点包括:开放源码、模块化、灵活、用户友好和社区支持。它可用于创建各种类型的网站,包括企业网站、电子商务网站、博客和社区论坛。技术要求包括:PHP 5.6 或更高版本、MySQL、MariaDB 或 PostgreSQL 数据库以及 Apache 或 Nginx Web 服务器。

phpcms不是免费吗phpcms不是免费吗Mar 01, 2023 am 10:24 AM

phpcms不是完全免费的。phpcms属于开源cms系统,但是开源并不等于免费,它有两个版本:免费版和商业版,免费版仅限于个人非商业用途,而商业版需要购买授权;个人可以作为研究使用,如果商业应用,需要支付一定费用。

phpcms用什么数据库phpcms用什么数据库Feb 21, 2023 pm 06:57 PM

phpcms用mysql数据库。phpcms是一个PHP开源网站管理系统,采用PHP+MYSQL做为技术基础进行开发。PHPCMS V9采用OOP方式进行基础运行框架搭建,支持的PHP版本是PHP5及以上、支持的MYSQL版本是MySql 4.1以上版本。

phpcms有哪些版本phpcms有哪些版本Jun 14, 2023 pm 01:13 PM

phpcms有两个版本比较知名,分别是:1、phpCMS4,支持自定义 URL 规则,网站管理后台美观易用,前端插件许多,可自由扩展功能;2、phpCMS2008R1,支持多语言、多站点管理,页面管理器便捷灵活方便,非常轻量级,运行速度快。

2023年最新phpcms视频教程推荐(二次开发必学)2023年最新phpcms视频教程推荐(二次开发必学)Oct 25, 2019 pm 03:45 PM

很多站长使用PHPCMS进行二次开发建站,PHP中文网特意推出了phpcms视频教程,大家可以随时随地免费观看视频教程,不需要从百度网盘下载,非常方便。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)