草庐IT

PHP通知抑制;只有某些情况/方法

coder 2024-04-16 原文

tl;dr - 在非常严格的环境中工作时,是否有一种有效的方法来管理 PHP 的错误报告级别,给定某些进程不那么严格的级别变得更容易?

好的;首先,我不相信“错误抑制”是一种解决方案。我(有理由确定我)从未使用过 @ 错误抑制运算符,并且无意这样做。我利用 set_error_handler()ErrorException(或一些派生的)并在 error_reporting(-1)<>(面向 future E_ALL | E_STRICT)

现在,我不想改变这些习惯,因为我发现它们是一个很好的实践(还有;如果有人有进一步改进我的开发/生产环境设置/实践的建议,我会洗耳恭听)

但是,当涉及到 View 生成时,这可能会变得有些乏味。正确的数据(数组索引、变量等)并不总是可用的,因为无论出于何种原因, Controller 都无法将某些数据传递给 View 。只要此数据对 View 生成不重要, View 仍应呈现。

我更喜欢这种语法,因为它不冗长但(我认为)非常容易理解:

// e() is a shortcut function; given the passed value evaluates to a boolean true
// it will echo() and return true, otherwise it simply returns false
<p><?php e($data['field']) or e('No data found'); ?></p>

当然,如果 $data['field'] 没有调用 offsetGet() 并且在没有索引的情况下返回 null , 我们出现了问题。注意遇到异常,异常遇到脚本失败。

我尝试过不同的实现方式,包括使用类节点类创建数据树来管理传递给 View 的数据列表/行。 __get() 实际上会创建 不存在的节点(在分配或访问时)(为了简化节点数据分配,并防止发出通知。__isset() 测试了有效性并会适本地返回 false) 它还实现了 ArrayAccess 用于访问节点数据,并且只会在缺少索引时返回 null

由于 PHP 魔法的开销,我选择放弃此实现(虽然我学到了很多关于重构/优化和分析的知识)

我已经改用 native 数组,但现在我的 View 的代码库中乱七八糟 isset(),坦率地说,这很烦人(几乎超过上述实现的性能损失)

现在,我认为最简单的解决方法是根据我们在脚本中的位置上下滑动 error_reporting() 槽口:

// View::render()
public function render($data){
    error_reporting(E_ALL & ~E_NOTICE);
    // view generation logic
    error_reporting(-1);
}

但这似乎不是最干净(也不是最安全)的修复;特别是在 View 中调用辅助函数时。我采用了一种 HMVC 方法,可以从 View 发出子请求,因此我需要找到所有 render() 转义点并使用 保护它们错误报告(-1)

我还有其他选择吗?

最佳答案

“ undefined variable ”通知非常有值(value),即使在 View 模板中也是如此,因为它们有助于发现拼写错误;但这需要在 Controller 中定义每个变量,或者检查它们是否在 View 中设置。

如您所见,这两个明显的解决方案有一些开销或缺点。即使禁用错误报告也会有一些开销,因为错误仍然会产生(错误消息被格式化,内部和用户错误处理程序被调用,等等;它们只是被隐藏)。这会隐藏您可能从 View 中调用的辅助方法的错误;这对调试没有帮助。

我建议您使用模板引擎。有些生成 PHP 代码的速度与手写代码一样快。他们会为你处理这个,并且会做更多(比如转义,你的 View 也应该充满 htmlspecialchars() 调用 ;))。

关于PHP通知抑制;只有某些情况/方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7059393/

有关PHP通知抑制;只有某些情况/方法的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  5. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  6. Ruby 方法() 方法 - 2

    我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby​​-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco

  7. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  8. ruby - Highline 询问方法不会使用同一行 - 2

    设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案

  9. ruby - 默认情况下使选项为 false - 2

    这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb

  10. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

随机推荐