如何以编程方式从类的方法之一中查找类的公共属性

2024-02-25

我有课Foo具有公共和受保护的财产。Foo需要有一个非静态方法,getPublicVars()返回所有公共属性的列表Foo(这只是一个例子,我从outside the Foo对象调用get_object_vars() http://php.net/get_object_vars将实现这一点,并且不需要我getPublicVars()方法)。

Note:它还必须返回在运行时分配给类定义中未定义的类实例(对象)的动态声明的属性。

这是例子:

class Foo{
    private $bar = '123';
    protect $boo = '456';
    public   $beer = 'yum';

   //will return an array or comma seperated list
   public function getPublicVars(){
      // thar' be magic here...
   } 
}

 $foo = new Foo();
 $foo->tricky = 'dynamically added var';

 $result = $foo->getPublicVars();  
 var_dump($result); // array or comma list with 'tricky' and 'beer'   

从类自己的方法(其中 public 和 protected 都可见)中获取对象的唯一公共属性的最简洁方法是什么?

我看过:

  • 查看 PHP 类实例(对象)内部以查看其所有可用的公共属性和方法的最佳方法是什么? https://stackoverflow.com/questions/6498476/what-is-the-best-way-to-look-inside-a-php-class-instance-object-to-see-all-of

但这似乎并没有解决我的问题,因为它指向使用get_object_vars()从物体外部。


Since PHP 8.1(2021 年 11 月)第一类可调用语法 https://www.php.net/manual/en/functions.first_class_callable_syntax.php#functions.first_class_callable_syntax可用于创建闭包,然后 __invoke() it:

return get_object_vars(...)->__invoke($this);

Since PHP 7.1(2016 年 12 月)从可调用对象创建闭包 https://www.php.net/manual/en/closure.fromcallable.php可用于创建闭包,然后 __invoke() it:

return \Closure::fromCallable("get_object_vars")->__invoke($this);

Since PHP 7.0(2015 年 12 月)可以创建一个闭包,但超出范围:

return (function($object){return get_object_vars($object);})->bindTo(null, null)($this);

(ikkez https://stackoverflow.com/users/2038179/ikkez有一个 PHP 7.4 变体answer https://stackoverflow.com/a/74309845/367456时间回到 2022 年。)

BeforePHP 7.0,可以使用 call_user_func() 的实现指定行为,这是布拉德·肯茨的 https://stackoverflow.com/users/1371433/brad-kent example https://stackoverflow.com/a/26914481/367456:

return call_user_func('get_object_vars', $this);

正如您已经意识到的,PHP 内置get_object_vars http://php.net/get_object_vars是范围敏感的。你想要的public仅对象属性。

因此,从该函数到公共变体并不是很大的一步:

function get_object_public_vars($object) {
    return get_object_vars($object);
}

调用这个get_object_public_vars只会给你公共属性,因为它超出了当前 $object 的范围。

如果您需要更细粒度的控制,您还可以使用ReflectionObject http://php.net/ReflectionObject:

(new ReflectionObject($this))->getProperties(ReflectionProperty::IS_PUBLIC);

这样做的好处是您不需要在全局命名空间中引入另一个函数。


不应使用函数 create_user_func() (因为每次创建新函数时都会使用 eval() 和 IIRC)。幸运的是,从 PHP 5.3(2009 年 6 月)开始,有匿名函数 https://www.php.net/manual/en/functions.anonymous.php.

然而,这是对以下问题的正确答案:jumc https://stackoverflow.com/users/1066549/jumc answered https://stackoverflow.com/a/15847048/3674562013 年 4 月,Brad Kents 的 hack 还没有出现,并且没有其他答案可以显示改变需要 PHP 5.4 的闭包范围(2012 年 3 月;“将关闭重新绑定实现为绑定到的参数 https://www.php.net/manual/en/closure.bindto.php." ref https://www.php.net/ChangeLog-5.php#5.4.0).

因此,为了完整性,PHP 5.4语法闭包示例:

$scope = array ( function ($object) { return get_object_vars($object); }, 'bindTo' );
return call_user_func($scope(null, null), $this);

作为以下形式的替代形式:

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

如何以编程方式从类的方法之一中查找类的公共属性 的相关文章

  • 检查 $_POST 数据

    我正在对表单进行一些垃圾邮件检查 下面的代码在我的本地主机上正常工作 如果为 true 则重定向到 google com 但是 当它在生产服务器上时却不起作用 执行脚本的其余部分并且不重定向到 Google com if POST SERV
  • php curl 使用 GET 发送变量 奇怪的结果

    我正在尝试调用远程站点上页面中的网址 决定使用curl 在远程站点上 url 变量显示为 REQUEST Array var1 gt val1 amp var2 gt val2 amp var3 gt val3 被调用的url是 http
  • 如何从父类中获取子类名

    我试图在不需要子类上的函数的情况下完成此任务 这可能吗 我有一种感觉 但我真的很想确定
  • php 数组中出现意外的 json 输出结构

    我正在尝试转换动态数据 如何从 PHP 获取此 JSON JSON 122240cb 253c 4046 adcd ae81266709a6 item 0 3 这就是我所做的 但它不起作用 PHP json array 122240cb 2
  • 免费 PHP 登录库 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在服务器上找不到本地主机或 phpMyAdmin:如何修复?

    我按照安装说明进行操作PHP MySQL and PHPMyAdmin 但是当我尝试访问时http localhost phpmyadmin 我收到此错误 未找到 在此找不到请求的 URL phpmyadmin 服务器 然后我尝试访问loc
  • PHP 通过 SSL 连接到 MS SQL

    我想要实现的目标非常简单 我想通过安全连接从 PHP 脚本连接到外部 MS SQL 数据库 然而 这已被证明是有问题的 到目前为止 经过三个小时的研究 我不知所措 客户端的平台是Ubuntu 这意味着我无法使用SQLSRV 安全连接已经在不
  • 无法访问 localhost/xampp/index.php

    我刚刚安装了 Windows 7 的 XAMPP 控制面板似乎工作正常 我启动了 MySql 和 Apache 我遇到的问题是 当我在浏览器 Google Chrome 中输入 localhost 时 它会将我发送到 http localh
  • AWS-PHP-SDK / SNS 直接寻址返回错误

    您好 我正在使用 Laravel 4 设置来利用 AWS SNS 向我的 iOS 设备发送推送消息 从 AWS 控制台向我的设备发布命令效果很好 然后我尝试从 PHP sns AWS get sns sns gt publish array
  • 适用于 Linux 的轻量级 IDE [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • PHP:读取所有传入 HTTP 请求的类 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 分页显示所有其他页面上第 1 页的相同帖子

    我最近在创建即将发生的事件列表时得到了很多帮助 请参阅此处显示即将举行的活动 包括今天的活动 https stackoverflow com questions 17343615 showing upcoming events includ
  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • Laravel Vue 组件只能传递数字?

    在我的 UserMenu vue 中我写道 export default props nameVal data return 并在blade php中
  • Facebook API sdk 4.0 - 将照片发布到 Facebook

    我正在尝试创建一个应用程序 用户可以在其中浏览照片并将其从计算机提交到 Facebook 为此 他们首先必须将照片上传到服务器 然后使用 Facebook 请求将此图像发布到 Facebook 我正在使用多部分 表单数据 这就是我到目前为止
  • 从 Laravel 4 输入生成新数组

    我使用 Input all 从动态生成的表单中获取一些输入 我使用 jQuery 来允许用户添加字段 字段名称为 first names last names 和 emails input 变量现在看起来像这样 array size 4 t
  • 字符串相似度的算法(比Levenshtein和similar_text更好)? php, Js

    在哪里可以找到比 levenshtein 和 phpimilar text 方法更准确地评估错误字符的拼写的算法 Example similar text jonas xxjon similar echo similar returns 6
  • 雄辩的第一个 where 子句

    我想知道 Laravel 如何实现雄辩的语法 以便可以静态调用第一个 where 子句User where User where id 23 gt where email email gt first 他们有吗public static f
  • Jquery一键提交多个同名表单

    我有动态创建的循环表单 我需要一键提交所有表单 我正在遵循下面的代码 你能建议我怎么做吗 谢谢
  • 如何从日期中查找该月的最后一天?

    如何在 PHP 中获取该月的最后一天 Given a date 2009 11 23 我要2009 11 30 并给出 a date 2009 12 23 我要2009年12月31日 t返回给定日期所在月份的天数 请参阅的文档date ht

随机推荐

  • 从模型中获取在数据透视表 Laravel 5 中没有条目的所有记录

    我正在尝试弄清楚如何实现以下目标 我找了又找 没有结果 我在 Laravel 5 应用程序中有一个数据透视表 它按预期工作 并在相应模型中具有以下功能 Module php public function sites return this
  • 使用 Python setuptools 的安装后脚本

    是否可以将安装后 Python 脚本文件指定为 setuptools setup py 文件的一部分 以便用户可以运行以下命令 python setup py install 在本地项目文件存档上 或者 pip install
  • Spring框架-在哪里解析JWT以进行自定义声明?

    我创建了一个 Spring JWT 授权应用程序 JWT 包含一些自定义声明 在资源服务器端 我想知道我应该在哪里解析 JWT 令牌来收集和检查这些声明 我应该在控制器或某些过滤器中执行此操作吗 最好的做法是什么 也许你有一些例子 您可以结
  • 无法使用flask-assets从sass文件生成all.css文件

    我厌倦了在我的 Flask 应用程序中使用 css 所以我决定使用 Flask 资产转向 scsshttps github com miracle2k flask assets https github com miracle2k flas
  • Spring ApplicationContext Bean 范围

    当您在 Spring applicationContext xml 文件中创建 Service bean 或 Dao bean 时 这些 bean 的范围是什么 每个访问 Web 应用程序的人都会使用同一个 Bean 实例 还是为每个用户的
  • 如何使用 swing 组件向 JLabel 添加刷新计时器

    我正在创建一个迷宫游戏 并希望在游戏舞台上显示一个计时器 我尝试过使用 java util 但它要求我摆脱我的摆动计时器 我怎样才能在游戏中添加一个令人耳目一新的计时器 此代码用于制作包含按钮窗格和游戏舞台的游戏框架 import java
  • 我可以安全地查询被 WRITE_TRUNCATE 替换的 BigQuery 表吗

    If configuration load writeDisposition https developers google com bigquery docs reference v2 jobs configuration load wr
  • 为 iPad / iPhone 加载不同的启动屏幕

    我想为 iPad 和 iPhone 加载不同的启动屏幕故事板 为此我在 info plist 中添加新条目 如下所示 但它只加载 iPhone 启动屏幕 任何帮助将不胜感激 提前致谢 Way 1 为此 您必须使用两个 xib 一款适用于 i
  • 如何用Java创建停靠面板?

    如何用 Java 创建停靠面板 如果你想使用Swing http en wikipedia org wiki Swing 28Java 29在你的应用程序中的对接框架中 有一些已经存在 InfoNode http www infonode
  • 读取带有unicode字符的文件

    我有一个 asp net c 页面 并尝试读取具有以下字符 的文件并将其转换为 从倾斜撇号到撇号 FileInfo fileinfo new FileInfo FileLocation string content File ReadAll
  • 如何使用 python 列出可用的测试?

    如何列出所有发现的测试 我发现这个命令 python3 4 m unittest discover s 但这并不完全是我想要的 因为上面的命令执行测试 我的意思是让我们有一个包含大量测试的项目 执行时间为几分钟 这迫使我必须等到测试完成 我
  • asp.net mvc从视图修改主文件

    我需要从视图文件 aspx 将类属性添加到正文标记 但该标记位于主文件中 如何从视图访问 body 标签 在你的视图输出中你可以添加一个jQuery http api jquery com addClass 执行此操作的客户端脚本将在页面拼
  • 将货币价值存储为美分/小单位有哪些缺点?

    我注意到一些金融 api 例如用于信用卡处理的 stripe api 要求将金额以美分形式传递 这似乎是一个很好的简化 这让我想知道为什么我不在我当前的应用程序中的所有地方都这样做在我的 Java 代码中使用数据库 NUMERIC 无限长度
  • 停止 shell 通配符扩展?

    有没有办法让编译后的命令行程序告诉 bash 或 csh 它不希望在其参数中扩展任何通配符 例如 人们可能需要一个 shell 命令 例如 foo 简单地返回该字符的 ASCII 数字值 不会 扩展发生在命令实际运行之前 您只能在运行命令之
  • 如何在报告中插入两页

    我面临一个问题 还有两个问题jrmxl文件 我想加入其中pdf文件 但每个都在一页中 我看到了下面的一些提示 但我不知道它们是否是最好的 因为我的第一个文件有 3 个频段 title detail and summary 第二个有detai
  • 如何获取 UITableView 标签文本字符串 - 自定义单元格

    我有一个带有自定义单元格的 UITableView 自定义单元格包含 UILabel 和 UIImageView 我在网上看到 当用户按下单元格时 可以从普通的 UITableView 单元格获取文本并将其存储在字符串中 但是 当您使用自定
  • 如何从不同的范围创建对象

    我在 Guice 中有一个范围单例的对象 在方法中f 我想创建一个新对象 但让 Guice 进行注入 我认为传递注射器并不是一个好的做法 那么我怎样才能获得一个新的 Guicy 对象实例呢 正如上面所建议的 提供商可能是做到这一点的方法 这
  • 功能检测自动播放 HTML5 音频 - 移动浏览器上的音频

    因此 我有一个网站 用户希望演示服务器端脚本生成的音频输出 他们选择一些选项并点击创建按钮 然后我在 HTML5 音频元素中进行 AJAX 并将 autoplay 属性设置为 true 这在桌面上效果很好 但在移动设备上效果不佳 到目前为止
  • 动态引用 Excel 工作表

    我有一个应该很简单的问题 但我没有解决它 我为一家商店打印了价目表 今年他们将零件编号分成了 5 张工作表 而不是一张 当用户想要打印价格标签时 她在 C10 中输入 单击工作表 价格表 并导航到她需要的零件号 C10 的计算公式为 价目表
  • 如何以编程方式从类的方法之一中查找类的公共属性

    我有课Foo具有公共和受保护的财产 Foo需要有一个非静态方法 getPublicVars 返回所有公共属性的列表Foo 这只是一个例子 我从outside the Foo对象调用get object vars http php net g