从 PHP 子类访问受保护的方法

2024-02-15

我可以使用至少两种基本方法来访问受保护的子类的类方法:

parent::myMethod();

$this->myMethod();

如果我不需要在子类中重写它,在这种情况下我必须这样做:

function myMethod() {
   ...
   parent::myMethod();
   ...
}

最推荐的调用方式是什么?我个人感觉使用起来比较舒服父级::myMethod()而不是$this->myMethod,因为第一个立即告诉我这个方法正在被继承。但我不确定在性能和最佳实践方面采用哪种方式。

EDIT:

检查一下,这是我的问题的真实情况。它使用 CodeIgniter,但即使您不熟悉它,您也可能会了解它:

class Admin_Controller extends CI_Controller {

    protected function validate_form($validation) {
            $this->load->library('form_validation');
            // This will validate the form sent against the validation rules group specified in $validation
            if ($this->form_validation->run($validation) == false) {   
                    throw new Exception('There are errors in the form');
            }
    }

}

class Articles extends Admin_Controller {

    function save($id) {
            $this->validate_form(strtolower(get_class($this));
            // OR
            parent::validate_form(strtolower(get_class($this));
            // Other actions
            ....
    }

}

class Login extends Admin_Controller {

    function signIn() {
            $this->validate_form(strtolower(get_class($this));
            // OR
            parent::validate_form(strtolower(get_class($this));
            // Other actions
            ....
    }

}

他们做两件不同的事情。的语义parent关键字是这样的,它会对其父类进行转发调用。的语义$this->method()然而,只有在调用该方法的实例未声明该方法的情况下,它才会将其调用转发给父类。同样重要的是要注意,孩子可能有父母和祖父母,因此在原型设计中也必须仔细考虑这一点。

如果您不希望该方法被覆盖,您应该使用final http://php.net/language.oop5.final方法原型声明中的关键字。

class MyClass {
    final protected function myMethod() {
    }
}

这确保了任何扩展类都无法重写该方法。如果扩展类尝试像下面的代码一样重写此方法,您将收到致命错误Fatal error: Cannot override final method MyClass::myMethod().

class MyOtherClass extends MyClass {
    public function myMethod() {
    }
}

另外,这使得你的代码更具可读性 and 不太容易出错因为您清楚地向任何阅读代码的人声明该方法是最终的并且不能被覆盖。

另外,你的方法的根本问题(如果你想使用parent::myMethod() vs. $this->myMethod())是你没有考虑当班级是一个时会发生什么孙子它的父级,例如......

class Father {
    protected function myMethod() {
        return __METHOD__;
    }
}

class Child extends Father {
    public function myMethod() {
        return __METHOD__;
    }
}

class GrandChild extends Child {
    public function myOtherMethod() {
        echo parent::myMethod(), "\n"; // Child::myMethod
        echo $this->myMethod(), "\n";  // Child::myMethod
    }
}

$obj = new GrandChild;
$obj->myOtherMethod();

正如您所看到的,即使您想获取父亲的方法,它们都会为您提供子方法。如果您从不打算在扩展类中重写该方法,只需将该方法声明为final,并且从对象上下文调用 $this->myMethod() 时应该始终没问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 PHP 子类访问受保护的方法 的相关文章

  • 替代 header("Content-type: text/xml");

    是否存在与以下内容等效的内容 header Content type text xml 我将 Google 地图与 Wordpress 一起使用 但收到 标头已发送 错误 我已经检查了所有文件并删除了所有空白 但错误仍然出现 所以只是想知道
  • 解析错误:语法错误,意外的“”(T_ENCAPSED_AND_WHITESPACE)[重复]

    这个问题在这里已经有答案了 完整错误 解析错误 语法错误 意外的 T ENCAPSED AND WHITESPACE 需要标识符 T STRING 或 变量 T VARIABLE 或数字 T NUM STRING 它说错误出现在第 12 行
  • 如何让 PagerDefault 查询与 Drupal 7 一起正常工作?

    我正在运行以下代码 query db select taxonomy index ti gt fields ti array nid gt condition ti tid term gt tid gt condition n status
  • PHP:会话 |无法解码会话对象

    我尝试将电子商务功能添加到遗留项目中 因此我仍然需要旧的会话处理程序 我使用 PHP v7 1 14 和 Session2DB https github com voku session2db tree 4 0 0 https github
  • 多个where条件codeigniter

    如何将此查询转换为活动记录 UPDATE table user SET email email last ip last ip where username username and status status 我尝试将上面的查询转换为 d
  • 将参数传递给基类构造函数

    如果基类和派生类都有带参数的构造函数 那么我们在哪里将参数传递给基类构造函数 像这样 public class DerivedClass BaseClass public DerivedClass int derivedParam Stri
  • $_COOKIE[] 设置后似乎没有反映更改

    我不记得过去使用 Cookie 时遇到过很多问题 但我在尝试时遇到了一些意想不到的结果 我在本地主机上运行 因此我的域设置 这将产生以下输出 Cookie Set Cookie equals 457718770 shou
  • Laravel 资源策略始终为 false

    我试图允许用户在 Laravel 5 4 中查看自己的个人资料 用户策略 php public function view User authUser user return true 在 AuthServiceProvider php 中
  • 如何将 imagecropauto() 与 IMG_CROP_TRANSPARENT 一起使用?

    当我尝试裁剪图像的透明区域时 它会保持原始大小 并且透明区域会变成黑色 如果我运行这段代码
  • 订单编辑页面中的 WooCommerce 自定义字段

    Display custom field Orders edit page add action woocommerce before order itemmeta storage location of order items 10 3
  • OOP 中的静态和动态变量/方法是什么?

    我试图更好地理解 OOP 中的基本概念 面向对象编程中的静态和动态变量和方法是什么 例如 使用 this 与使用双冒号 之间有什么区别 this this gt a method 优点 缺点 这个 不是自我记录的 如下所示 this gt
  • 使用 PHP DOMDocument 更改标签属性值

    我想用 PHP DOMDocument 更改标签属性的值 例如 假设我们有这行 HTML a href http foo bar Click here a 我将上面的代码加载到 PHP 中 如下所示 dom new domDocument
  • 如何启用 php curl 以在 php cli 中使用

    我已经在没有服务器的情况下在我的计算机上安装了 php 并使用 cli 运行它 但未启用 php curl 我不知道如何执行此操作 如果有人遇到此线程并使用 wamp 服务器 这里有一个针对上述问题的快速解决方案http forum wam
  • Codeigniter 分页:运行查询两次?

    我正在使用 codeigniter 和分页类 这是一个非常基本的问题 但我需要确保我没有遗漏任何东西 为了获得对从 MySQL 数据库获取结果进行分页所需的配置项 基本上需要运行查询两次 对吗 换句话说 您必须运行查询来确定记录总数 然后才
  • 将程序存储在 phpMyAdmin 中

    我必须将存储过程添加到 MySQL 数据库 问题是托管提供php我的管理员来管理数据库 我在网上搜索了一下 想法是运行创建程序的MySQL本机语句 但由于程序的代码通常可能有 我们必须更改 MySQL 中的分隔符 php我的管理员没有这个选
  • mysqli_stmt_bind_result 的奇怪问题

    好吧 这让我很烦恼 我似乎在 PHP 文档中找不到任何内容 在 Google resultosphere 中也找不到任何内容 所以也许有人可以在这里提供帮助 我正在使用准备好的语句 绑定结果 然后使用这些绑定结果来填充下拉列表 例子
  • php echo 不工作

    我的代码似乎不起作用 单选按钮出现 但旁边什么也没有 似乎 mysql fetch array 由于某种原因无法工作 因为我已经玩过代码并反复测试它以查找代码似乎遇到的位置出现问题并停止工作 有人可以告诉我出了什么问题吗 欢呼声我是新手 最
  • PHP 对象创建和内存使用

    一个基本的虚拟类 class foo var bar 0 function foo function boo echo memory get usage echo n foo new foo echo memory get usage ec
  • JQuery 验证不起作用

    我有一种表单 其中一个输入类型的值为 名字 但这可以在 onfocus 函数上更改我想验证此输入字段 如果它为空白或 名字 我有两个 jQuery 文件jquery 1 4 2 min js jquery validate pack js
  • 创建具有动态更新变量的数组

    我有一些 PHP 变量 它们的名称直接链接到它们包含的函数 是否有办法自动创建这些变量 以便我可以使用所有变量 00 200 这就是我现在正在做的事情 regdays00 is user reg matured 00 regdays02 i

随机推荐

  • CORS 请求在 docker-compose 环境中失败

    我希望弄清楚为什么在 Firefox 中运行的 React 应用程序中的 API 请求失败 标头如下 Accept Accept Encoding gzip deflate Accept Language en US en q 0 5 Co
  • 为什么 Kit Kat 需要使用 isValidFragment?

    自从 KitKat 发布以来 我注意到我的一大堆应用程序都更新了 修复 Kit Kat 中的崩溃 最近 当我发布自己的应用程序时 我发现其可能的来源是使用首选项活动的新 isValidFragment 要求 然而 我无法让任何人解释为什么突
  • 如何查询 postgres 的可选参数?

    我正在设置一个REST服务和我正在使用postgres作为数据存储 我想知道如何设置postgres查询以使用可选参数 IE SELECT from users where hair color 1 and eye color 2 其中 1
  • 支持 iOS 10 的 Xcode 7.3.1

    现在我有一个基于 Xcode 7 3 1 的应用程序 运行良好 但当我想将应用程序安装到 iOS 10 设备上时 出现了一个问题 提示 找不到开发人员磁盘映像 所以我找到了一个解决方案 如下 https danielemargutti co
  • React:为什么 `this.props.children` 未定义?

    我正在用 ReactJS 构建一个电子电阻计算器 我有一个组合组件声明如下 var ResistanceCalculator React createClass getInitialState function return bands 0
  • XSL if else 条件

    我有一个要求 我想要 if else 语句来检查节点是否具有属性或仅具有字符串 例如 1 个节点有0 File s found另一个具有诸如
  • 在 Kubernetes 中找不到持久卷声明

    目前我尝试实施持续量在我的 yaml 文件中 我在互联网上阅读了很多文档 但我不明白为什么当我进入仪表板窗格时会出现此消息 未找到持久卷声明 karaf conf pod yaml apiVersion v1 kind Pod metada
  • Linux 中 SVN 存储库目录放在哪里?

    我正在 Ubuntu Linux 上设置一个新的 SVN 服务器 放置存储库的好地方 最佳实践 在哪里 我应该创建一个新用户吗 服务器将通过 http 访问 因此无需创建用户帐户等 与 svn 的情况一样 提前谢谢了 我喜欢把东西放在下面
  • Python 访问 JSON 对象中的数据

    所以我在我的脚本中这样做 import json info json loads get info print info 哪个输出 richard richard desktop projects hello python python m
  • 将 libpq.5.dylib 复制到 /usr/lib/libpq.5.dylib

    我无法在 R 中加载包 因为该文件libpq 5 dylib不在 usr lib libpq 5 dylib 它是在 usr local Cellar libpq 13 0 lib libpq 5 dylib 我尝试了这一行 sudo ln
  • iframe 的内容文档

    对于 iframe 甚至旧的 frame 元素 contentDocument 到底代表什么 它相当于 html 元素还是 body 元素 它有什么用 所有浏览器都支持此属性吗 w3 org http www w3 org TR 2003
  • 开头括号中的正则表达式

    我有一个正则表达式试图按专业划分问题 假设我有以下正则表达式 P
  • AngularJS:用户身份验证后重新加载 ng-include (或解决问题的更好方法)

    我真的只是在学习 Angular 我正在尝试创建一个基于身份验证限制内容访问的应用程序 我的身份验证部分正在工作 也使用 Laravel PHP 框架 但我在根据身份验证状态 重新加载 某些内容时遇到问题 即在身份验证成功后 最初 我想做的
  • html 中表单布局的最佳实践——表格还是流程?

    在 html 中布局表单的最佳实践是什么 特别是当您有一组带有标签的字段和可能的错误指示器时 我能做的最好的事情就是使用表格 但这在面向 CSS 的布局设计中效果不佳 例如 table tr td Name td td td tr tabl
  • Docker:“未找到 npm”

    我正在尝试容器化 ASP NET Core 和 Angular 应用程序 但遇到了一些麻烦 我收到这些错误 gt internal load build definition from Dockerfile 0 4s gt gt trans
  • AlertDialog 中的 Flutter NumberPicker 无法正常工作

    当我使用 NumberPicker 选择新值时 它总是跳回之前的值 而不是当前选择的值 我在 AlertDialog 中使用 NumberPicker 并使用 pickValue 函数调用 NumberPicker void pickVal
  • 上传并播放音频文件JS

    我有一个 HTML 音频标签和一个 HTML 文件输入标签 如下所示 我希望用户使用 上传文件 按钮从计算机中选择一首歌曲 然后使用音频标签播放它
  • 安装错误:ftheader.h:没有这样的文件或目录

    当我尝试构建 matplotlib 1 3 1 时 出现以下 freetype 标头错误 可能是找不到 ftheader h 关于如何解决这个问题有什么想法吗 注意 我刚刚按照中提到的说明安装了 Freetype 2 5 0 1自由类型安装
  • 崩溃 CGDataProviderCreateWithCopyOfData:vm_copy 失败:状态 1

    我遇到崩溃并出现以下错误 CGDataProviderCreateWithCopyOfData vm copy 失败 状态 1 我有多个问题 您可以提供帮助 vm copy failed 中状态 1 代表什么 仅当我在数据复制的内部 for
  • 从 PHP 子类访问受保护的方法

    我可以使用至少两种基本方法来访问受保护的子类的类方法 parent myMethod this gt myMethod 如果我不需要在子类中重写它 在这种情况下我必须这样做 function myMethod parent myMethod