【问题标题】:Upgrading to PHP 7.1升级到 PHP 7.1
【发布时间】:2019-02-18 11:49:54
【问题描述】:

我有一个关于将我的主题文件升级到 PHP 7.1 的快速问题。我知道这很容易做到,但我不懂 PHP。

它目前与 5.3 兼容,这是我主题的两个部分中的唯一错误:“错误 | 自 PHP 5.3 起不推荐使用调用时传递引用,自 PHP 5.4 起禁止使用。”

我会询问我的主题开发人员,但上次他们删除了我所有的自定义 CSS 代码。他们的支持非常糟糕,我不能再相信他们了。

两个问题行都使用此代码setup_postdata( $GLOBALS['post'] =& $post_object );

主题文件 #1:

if ( ! defined( 'ABSPATH' ) ) {
    exit;
}
if ( $upsells ) : ?>
<div class="ps-section pb-50">
    <div class="ps-container">
        <div class="ps-section__header text-center">
            <h2 class="ps-section__title"><?php esc_html_e('You may also like&hellip;', 'xuper');?></h2>
        </div>

        <div class="ps-section__content">
            <div class="ps-slider--center owl-slider products" data-owl-auto="true" data-owl-loop="true" data-owl-speed="5000" data-owl-gap="30" data-owl-nav="true" data-owl-dots="false" data-owl-item="4" data-owl-item-xs="1" data-owl-item-sm="2" data-owl-item-md="3" data-owl-item-lg="4" data-owl-duration="1000" data-owl-mousedrag="on" data-owl-nav-left="&lt;i class='ps-icon-arrow-left'&gt;&lt;/i&gt;" data-owl-nav-right="&lt;i class='ps-icon-arrow-right'&gt;&lt;/i&gt;">

                <?php foreach ( $upsells as $upsell ) : ?>

                    <?php
                        $post_object = get_post( $upsell->get_id() );

                        setup_postdata( $GLOBALS['post'] =& $post_object );

                        wc_get_template_part( 'content', 'product' ); ?>

                <?php endforeach; ?>
            </div>
        </div>
    </div>
</div>      
` `
                    <?php
                        $post_object = get_post( $related_product->get_id() );

                        `setup_postdata( $GLOBALS['post'] =& $post_object );

                        wc_get_template_part( 'content', 'product' ); ?>

                <?php endforeach; ?>
            </div>
        </div>
    </div>
</div>  

wp_reset_postdata();

感谢您的帮助,我真的很感激!

【问题讨论】:

  • 嗨。如果这是与 wordpress 相关的,请将 wordpress 标签添加到您的问题中。
  • 我猜它可能是您的setup_postdata 电话中的=&amp;。不过,除了$GLOBALS['post'] =&amp; $post_object; setup_postdata($GLOBALS['post']); 之外,还不确定如何修复它。
  • 嗨。您发布的错误消息看起来不像标准的 PHP 错误消息。这是运行此代码产生的确切文本吗?或者这是您正在运行以检查代码兼容性的工具的输出?
  • 更好的重复将是 stackoverflow.com/questions/8971261/…stackoverflow.com/questions/4665782/… 但问题中的代码实际上并不包含传递引用,这就是为什么我想知道这是否是一个检查工具错误消息。

标签: php wordpress php-7.1


【解决方案1】:

setup_postdata( $GLOBALS['post'] =&amp; $post_object ); 正在通过引用进行赋值,这是一种奇怪的方式。

在这行代码中,您引用了 WordPress 的 setup_postdata 函数,它基本上在幕后填充了一堆以 WP 为中心的变量。通常,您只需使用:setup_postdata($post_object) 调用它就可以了。

当您关闭循环时不要忘记调用wp_reset_postdata(),这会重置您可能在网站其他地方运行的 WP 其他循环的变量。

【讨论】:

【解决方案2】:

变量$post_object之前的这个&amp;字符通过引用强制赋值。

传递函数参数时不需要 &。默认情况下,对象通过引用传递 PHP5。官方 WP 文件说 you must pass a refrence 是全局 post 变量。您可以通过这种方式满足这两个要求:

$GLOBALS['post'] =& $post_object;
setup_postdata($post_object);

【讨论】:

  • 在任何版本的 PHP 中都有no problem with assignment by reference in this position,只是删除它很可能会在应用程序的其他地方引起问题。
  • @IMSoP 好吧,这确实不是一个好建议。你现在怎么看?
  • 您链接到的页面包含据称导致错误的确切代码行作为使用此功能的正确方式,我不这样做'不知道它不应该在 PHP 7.1 中工作的任何原因。正如我对这个问题的评论,我认为整个问题实际上是在其他地方,我们没有关于这个错误消息来自哪里的完整故事。 (顺便说一句,“对象通过引用传递”也是不正确的,尽管the distinction between an object pointer and a reference is a subtle one。)
猜你喜欢
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多