【问题标题】:PHP InstanceOf works locally but not on host serverPHP InstanceOf 在本地工作,但不在主机服务器上
【发布时间】:2018-06-08 22:12:45
【问题描述】:

我对 PHP 7 的 instanceof 语句有疑问,该语句仅在特定条件下发生。

似乎 instanceof 在我的开发机器(运行 PHP 7.0.13 的 MAMP Pro)上本地工作,但在我的托管服务器(HostEurope,PHP 7)上不工作。

我尝试了以下方法:

  1. 降级到 PHP 5.6
  2. 使用 is_a 代替
  3. 使用完全限定名称,例如\网站\广告

但它们都表现出相同的行为。

我尝试在谷歌上搜索“PHP instanceof not working”及其变体,但没有找到任何相关内容。

我想知道是否有人遇到过类似的或可能的解决方案来尝试?

有问题的代码是:

<?php

namespace Site;

require_once(__DIR__."/../interface/IOutput.php");
require_once(__DIR__."/../lib/Lib.php");
require_once(__DIR__."/../site/AdMediumRectangle.php");
require_once(__DIR__."/../site/AdSnapBanner.php");
require_once(__DIR__."/../const/Const.php");

class AdFactory
{

    /**
     * Define(AD_BANNER, 0);
     * Define(AD_RECTANGE, 1);
     * Define(AD_SUPERBANNER, 2);
     * Define(AD_SKYSCRAPER, 3);
     **/

    /**
     * @param $object
     * @return AdMediumRectangle|AdSnapBanner|string
     */
    public static function CreateObject($object)
    {
        $ad = wire(pages)->get("/ads/")->children->getRandom();

        if ($ad == null)
            return new \Exception("No Random Ad found");

        switch ($object) {
            case AD_BANNER:
                echo "AD_Banner Selected\r\n";
                $adSnapBanner = new AdSnapBanner($ad);
                return $adSnapBanner;
                break;
            case AD_RECTANGLE:
                echo "AD Rectangle Created\r\n";
                $adRectangle = new AdMediumRectangle($ad);
                return $adRectangle;
                break;
            case AD_SUPERBANNER:
            case AD_SKYSCRAPER:
            default:
                echo "AdFactory BlankObject created";
                return "";
                break;
        }
    }


    public static function Markup($object)
    {
        $obj = AdFactory::CreateObject($object);

        if (($obj instanceof AdSnapBanner) || ($obj instanceof AdMediumRectangle)) {
            echo "InstanceOf worked";
            return $obj->Markup();
        }
        else {
            echo "return blankString";
            return "";
        }
    }
}

更新:这是调用上述 AdFactory 类的代码

<?php

namespace Site;

require_once(__DIR__."/../interface/IOutput.php");
require_once(__DIR__."/../lib/Lib.php");
require_once(__DIR__."/../factory/AdFactory.php");
require_once (__DIR__."/../const/Const.php");

class AdInjector
{
    public static function Inject($page, $ad_pos)
    {
        //Select an Ad from /Ads/ according to criteria
        //$ads = wire(pages)->get("/ads/")->children;
        $count = 1; //$ads->count();

        if ($count > 0) {
            $mod = $page->id % 3;

            echo "mod=" . $mod . "\r\n";
            if ($mod == $ad_pos) {
                switch ($mod) {
                    case AD_POS_TITLE;
                    case AD_POS_BANNER:
                        //Pick an Snap Banner
                        echo "Banner Injected (banner):" . AD_BANNER . "\r\n";
                        return AdFactory::Markup(AD_BANNER);
                        break;
                    case AD_POS_SIBLINGS:
                        echo "Banner Injected (rect):" . AD_RECTANGLE . "\r\n";
                        //Pick an Ad Rectangle
                        return AdFactory::Markup(AD_RECTANGLE);
                        break;

                    default:
                        return "";
                        break;
                }
            } else
                return "";
        } else
            return "";
    }
}

【问题讨论】:

  • 您总是可以使用“get_class()”来获取对象的实际类。看看它是什么实例

标签: php-7 instanceof processwire


【解决方案1】:

instanceof 是一种语言结构,它对 PHP 来说非常重要,以至于实际上不可能不正常工作。

您提供的代码不足以说明问题可能发生在哪里。

很有可能,您的在线服务器上有一个不可读的文件夹,而只是在某个地方获得了 null 值,而不是代码中的预期对象。问问自己:“如果它不是我期望的对象,那还有什么?”

使用var_dump()printf() 调查变量实际包含的内容,您很快就会发现错误。

对于您的代码,PHPUnit 测试将是一个好处,或者至少在您的代码中到处使用assert()

【讨论】:

    【解决方案2】:

    原来我对 Processwire CMS 进行的 1 个 API 调用存在错误。

    $ad = wire(pages)->get("/ads/")->children->getRandom();
    

    而且我的 Processwire 本地实例和服务器实例不是同一个版本,这对我来说是个新闻。我通常会同步它,包括我使用的任何模块。

    我还怀疑我的空检查不正确 PHP,添加到问题。

    【讨论】:

      【解决方案3】:

      这与代码中使用的命名空间有关:

      本地(没有命名空间的代码)我用这个,工作正常:

      if ($xmlornot instanceof SimpleXMLElement) { }
      

      但在服务器上(带有命名空间的代码)只有这样才有效:

      if ($xmlornot instanceof \SimpleXMLElement) { }
      

      另请参阅此问题/答案:instanceof operator returns false for true condition

      【讨论】:

        猜你喜欢
        • 2013-04-28
        • 2016-08-04
        • 2014-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-07
        • 2019-08-18
        • 1970-01-01
        相关资源
        最近更新 更多