如何将变量设为特征的私有变量?

2024-03-28

我想在一个类中多次重用某个功能。此功能依赖于私有变量:

trait Address {
    private $address;

    public function getAddress() {
        return $this->address;
    }

    public function setAddress($address) {
        $this->address = $address;
    }
}

我发现的唯一方法使用该特质两次 https://stackoverflow.com/questions/13582061/how-to-use-a-trait-several-times-in-a-class,如下:

class User  {
    use Address {
        getAddress as getHomeAddress;
        setAddress as setHomeAddress;

        getAddress as getWorkAddress;            
        setAddress as setWorkAddress;
    }
}

问题是,通过这样做,私有变量$address在不同的方法之间共享,并且代码将无法按预期工作:

$user = new User();
$user->setHomeAddress('21 Jump Street');
echo $user->getWorkAddress(); // 21 Jump Street

有没有一种解决方案可以真正使用该特征两次,而不共享其私有变量?


声明一个特质use不会创建该特征的实例。 Traits 基本上只是复制并粘贴到 using 类中的代码。这as只会为该方法创建一个别名,例如它会添加类似的东西

public function getHomeAddress()
{
    return $this->getAddress();
}

到你的用户类。但这仍然只是这一特征。不会有两个不同的$address属性,但只有一个。

您可以将这些方法设为私有,然后将任何公共调用委托给它__call通过对方法名称进行开关/大小写并使用数组作为地址,例如

trait Address {
    private $address = array();

    private function getAddress($type) {
        return $this->address[$type];
    }

    private function setAddress($type, $address) {
        $this->address[$type] = $address;
    }

    public function __call($method, $args) {
        switch ($method) {
            case 'setHomeAddress':
                return $this->setAddress('home', $args[0]);
            // more cases …
        }
    }
}

但这只是一堆蠕虫。

换句话说,你无法理智地用特质做你想做的事情。要么使用两个不同的特征。或者使用好的旧聚合并添加具体的代理方法。

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

如何将变量设为特征的私有变量? 的相关文章

  • 如何使用类中的常量作为 php 函数中的参数定义?

    我有一堂课 class FetchMode const FetchAll 0 const FetchOne 1 const FetchRow 2 和一个函数 function getRecordSet FetchMode FetchMode
  • 使用正则表达式、PHP 解析日志文件

    我对正则表达式非常糟糕 谁能帮我解决我需要的表达式 以便从日志文件中分离出我需要的两个值 日志文件示例 1 28 2013 8 43 22 PM Removed 178 76 234 41 1 28 2013 8 43 22 PM Remo
  • 读取用 php 分块的范围块

    我有一个输入字段 可以在其中粘贴下载网址 之后 我使用 AJAX 请求来获取文件信息 例如 headerinfo 内容长度 mime 类型 如果我使用curl 接受范围 然后 我开始连续循环 xhr2 请求 其中包含我的 php 文件的范围
  • 准备好的语句什么时候会失败? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我一直在搞乱MySQLi对象在PHP 并且习惯于在执行语句之前准备语句 到目前为止 我主要做了以下事情 if stmt mysqli
  • $mysqli->fetch_object($result) 不起作用

    我正在学习mysqli 我正在尝试从表 tbllogin 中获取数据 DATABASE CONNECTION hostname p localhost database dbLogin username user1 password pwd
  • PHP数组删除重复的键值并仅显示一个

    Array 0 gt Array user id gt 78 post id gt 3 post user added id gt 2 1 gt Array user id gt 76 post id gt 8 post user adde
  • isSaleable() 和 isAvailable() 有什么区别?

    我正在我的 Magento 主题的 单个 产品页面上显示库存可用性 但有些事情我并不完全理解 我看到模板中使用了两种方法来检查产品是否可供销售 Mage Catalog Model Product isAvailable Mage Cata
  • 如何制作自己的 while 循环,就像 WordPress 循环一样?

    我是新来的 也是 PHP 新手 只是想知道如何制作我自己的灵活循环 就像在 WordPress 中一样 注意我不是在谈论 wordpress 我想在我自己的 PHP 应用程序上实现它 我们回顾一下WP 有一段代码是这样的 while hav
  • Composer 已安装,但获取 /usr/bin/env: php: No such file or directory

    在 CentOS 7 上 我安装了 PHP 7 1 然后我安装了作曲家 cd tmp curl sS https getcomposer org installer php71 gt used php71 instead of php ph
  • Yii2迁移问题

    我是第一次使用 yii2 我想尝试 yii 迁移 问题 我创建了迁移文件 php yii migrate create new table 文件已创建 然后我将新表详细信息输入到迁移文件中 当我跑步时php yii migrate我收到错误
  • html iframe 中的字符错误

    对不起我的英语我说西班牙语 我正在尝试显示多个php and mysql将在 iframe 内显示的注册 问题是 iframe 向我显示特殊字符的错误 例如 重音符号 感叹号等 D ndecuestamenosyseconsumem s 这
  • Google 站点地图日期格式

    我需要 php 中站点地图的日期格式 我怎样才能做到这一点 这个输出对吗
  • 在 php 中进行 AES 加密,然后用 Javascript (cryptojs) 解密

    我正在寻找一种对简单文本 5 到 6 个数字和 或字符 进行双向加密的方法 问题是我想在 php 中进行加密 然后通过 Javascript 解密 对于 php 我已经使用 mcrypt encode 进行了测试并使其正常工作 因此当我尝试
  • jquery javascript 在 codeigniter 中不起作用

    大家好 感恩节快乐 我在将此脚本包含在 codeigniter 中时遇到一些问题
  • CakePHP 后退和前进按钮没有布局

    我们正在 CakePHP 中构建一个大型 CMS 并集成了 Croogo 安装 我们最近遇到了一个问题 当用户单击back在浏览器中 或forward按钮 您最终得到的是使用以下命令的视图 ctp 文件blank布局 所以没有样式 js 等
  • 如何删除空 html 标签(其中包含空格和/或其 html 代码)

    需要 preg replace 的正则表达式 这个问题没有在 另一个问题 中得到回答 因为并非我要删除的所有标签都不为空 我不仅要从 HTML 结构中删除空标签 还要删除包含换行符以及空格和 或其 html 代码的标签 可能的代码是 删除匹
  • 无法识别 php 变量

    我在两个文件中分别有以下代码 文件一 php
  • Laravel 5 模型 $cats 到数组 utf-8 JSON_UNESCAPED_UNICODE

    当您有一个数组字段并将其保存在数据库中时 它会对数组进行漂亮的 json encode 但没有 JSON UNESCAPED UNICODE 选项 数据最终如下所示 en u039d u03ad u03b1 这几乎没什么用 解决方案当然是使
  • AngularJS + Laravel 5 身份验证

    在使用 AngularJS 构建 SPA 时 我想在 AngularJS 网站中实现用户身份验证 但是 我不知道从哪里开始以及最佳实践是什么 基本上我有一个确定可以担任一个或多个角色 我寻找了一些例子 这样我就可以对如何正确处理这个问题有一
  • PHP日期时间“下周星期三”给我星期一

    我正在尝试使用以下方法获取下周星期三的日期new DateTime next week wednesday 然而 它返回2016 12 19 00 00 00 000000今天是星期一 为什么会这样呢 如何得到正确的结果 我尝试在在线 PH

随机推荐

  • 如何使用java解码引用打印[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如何使用 Java 解码 Quote
  • ng-bind 不应该也适用于输入吗?

    我对我的有点困惑
  • pycurl中登录并使用cookie

    我需要下载受密码保护页面上的文件 要手动访问该页面 我首先必须通过普通登录页面进行身份验证 我想使用curl 在脚本中获取此页面 我的脚本首先登录 它似乎成功了 它从 PUT 到 login 返回了 200 但是 获取所需页面失败 返回 5
  • 在球体上均匀生成点

    我感兴趣的是生成围绕球体 均匀 且非随机 分布的点 就像高尔夫球的凹坑或足球上六边形的顶点一样 是否有明确定义的算法可以做到这一点 注意 我知道这些点并不是真正 均匀 分布在球体上 但它们的分布方式是 从直视任何点的任何方向看 点的分布看起
  • 如何对字符串中的字母进行计数和排序

    我想对用户输入的字母进行排序 并打印出用户输入的字符串中每个字母的数量 这就是我到目前为止所拥有的 我想知道这是否是正确的方法 我对java比较陌生 所以请让事情尽可能简单 根据我使用循环而不是大量 if else 构造的建议 我对我的代码
  • Aurelia CLI 包括 Bootstrap Glyphicons

    我正在尝试将 Bootstrap 包含在我的 Aurelia CLI 项目中 并且 CSS 和 JS 工作正常 我遇到的唯一问题是字形需要加载字体文件 我使用这个配置 dependencies name bootstrap path nod
  • 如何使用 Jest + Vuejs 模拟 window.location.href?

    目前 我正在为我的项目实施单元测试 并且有一个文件包含window location href 我想模拟这个来测试 这是我的示例代码 it method A should work correctly gt const url http d
  • Laravel:每当我返回模型时,总是返回与它的关系

    我有 2 张桌子 User Doctor id id email user id name signature last name photo password description date birth Every Doctor与一个有
  • 如何使用构造函数注入创建对象?

    我如何使用提供 Cat 的组件创建 Dog 的实例 public final class Dog private final Cat mCat public final static String TAG Dog Inject public
  • DataGridView.SelectedCells 中的单元格顺序?

    我想知道 DataGridView SelectedCells 中单元格的顺序是什么 我假设 SelectedCells 0 应返回第一个单元格 最左上角 而 SelectedCells Count 1 应返回最后一个单元格 最右下角 但奇
  • Python 3.6+:嵌套多处理管理器导致 FileNotFoundError

    所以我尝试在字典的字典上使用多处理管理器 这是我最初的尝试 from multiprocessing import Process Manager def task stat test z 1 test y Y0 5 if name mai
  • Mysql 覆盖 vs 复合 vs 列索引

    在下面的查询中 SELECT col1 col2 FROM table1 WHERE col3 value1 AND col4 value2 如果我有 2 个单独的索引 其中一个位于col3另一个在col4 此查询中将使用其中哪一个 我在某
  • 哪些编译器支持 std::filesystem?

    感谢 C 11 在与 boost 长期相处之后 最后一个让我依赖它的组件是文件系统 根据链接 std filesystem 似乎是作为实验实现的 文件系统库 http en cppreference com w cpp experiment
  • 使用 freemarker 重新定位光标

    我正在使用免费标记和java 我必须将结果输出到txt 文件中 假设我必须打印 3 列 A B C 在类似的模式中 所有三个属性均为字符串 条件是 如果引用 A 的字符串长度超过 3 则应在下一行打印 也就是说 如果长度为 8 则前 3 个
  • php.ini - 设置 upload_tmp_dir

    我有一个允许用户上传照片的页面 我认为相当标准的 php 这适用于我迄今为止一直使用的实时服务器 但我最近在我的 Mac 上设置了 php 现在上传已停止工作 我猜这是因为 php ini 文件中的 upload tmp dir 没有正确设
  • 计算每行内字段的累积和

    免责声明 我是新手 我一直在广泛寻找问题的答案 但没有成功 如果我没有找到关于此的帖子 请向我推荐 我一直在尝试使用 awk 计算相当大的数据文件的每一行中每个字段的累积和 任何帮助将非常感激 我的文件包含数十万行 其中行的长度 字段数量
  • 在特定时间运行命令

    我正在尝试在特定时间运行命令 我看过 at 命令 但我不知道如何让它工作 这就是我所做的 at 1843 Enter php run this script php Ctrl D 但如何在 bash 脚本中执行此操作呢 我的意思是 我需要按
  • 从 apache 到 IIS 的反向代理总是失败并显示 404

    我正在尝试设置从 apache 到 IIS 7 服务器的反向代理 我已经设置了非常基本的代理规则
  • 如何在 iPhone Web 应用程序中将方向锁定为纵向模式?

    我正在构建 iPhone Web 应用程序 并希望将方向锁定为纵向模式 这可能吗 有没有任何网络工具包扩展可以做到这一点 请注意 这是一个用 HTML 和 JavaScript 编写的适用于 Mobile Safari 的应用程序 而不是用
  • 如何将变量设为特征的私有变量?

    我想在一个类中多次重用某个功能 此功能依赖于私有变量 trait Address private address public function getAddress return this gt address public functi