2017-03-02 297 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

    相關問題