Php 7 PHP InstanceOf在本地工作,但不在主机服务器上工作

Php 7 PHP InstanceOf在本地工作,但不在主机服务器上工作,php-7,instanceof,processwire,Php 7,Instanceof,Processwire,我对PHP7的instanceof语句有一个问题,它只在某些条件下发生 instanceof似乎在我的开发机器(运行PHP7.0.13的MAMP Pro)上本地工作,但在我的托管服务器(HostEurope,PHP7)上不工作 我尝试了以下方法: 降级到PHP5.6 使用是一种替代 使用完全限定名,例如。\Site\Ad 但它们都表现出相同的行为 我在谷歌上搜索过“PHP instanceof not working”及其变体,但没有找到任何相关内容 我想知道是否有人经历过类似的事情或可能的解决

我对PHP7的instanceof语句有一个问题,它只在某些条件下发生

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

我尝试了以下方法:

  • 降级到PHP5.6
  • 使用是一种替代
  • 使用完全限定名,例如。\Site\Ad
  • 但它们都表现出相同的行为

    我在谷歌上搜索过“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 "";
            }
        }
    }
    

    instanceof
    是一种对PHP非常重要的语言结构,实际上不可能不正常工作

    您提供的代码不足以说明问题可能发生在何处

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

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


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

    结果表明,我对Processwire CMS进行的一个API调用中存在错误

    $ad = wire(pages)->get("/ads/")->children->getRandom();
    
    我的Processwire本地和服务器实例的版本不一样,这对我来说是新闻。我通常有它的同步,包括我使用的任何模块


    我还怀疑我的null检查不正确,这又增加了问题。

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

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

    if ($xmlornot instanceof SimpleXMLElement) { }
    
    但是在服务器上(使用名称空间的代码),只有这样做有效:

    if ($xmlornot instanceof \SimpleXMLElement) { }
    

    另请参见此问题/答案:

    您可以始终使用“get_class()”来获取对象的实际类。看看是什么例子
    if ($xmlornot instanceof \SimpleXMLElement) { }