2017-03-02 249 views
0

我有一个PHP 7的instanceof语句的问题,这个语句只在某些条件下发生。PHP InstanceOf在本地工作,但不在主机服务器上

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

  • 使用完全合格的名字,例如:

    1. 降级到PHP 5.6
    2. 我曾尝试以下\网站\广告

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

    我试过Google搜索“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 ""; 
        } 
    } 
    
  • +1

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

    回答

    0

    我发现Processwire CMS的API调用中有一个错误。

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

    而我的ProcessWire的本地和服务器实例不是相同的版本,这是我的新闻。我通常会同步它,包括我使用的任何模块。

    我也怀疑我的空检查是不正确的PHP,增加了问题。

    1

    instanceof是一个语言结构是如此的重要,以PHP,这是代码事实上不可能不正常工作。

    您提供的代码不足以说明问题的发生位置。

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

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

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

    +0

    感谢@DanFromGermany的建议。 – Francis

    相关问题