2017-03-02 4 views
0

PHP 7의 instanceof 특정 조건에서만 발생하는 문에 문제점이 있습니다.PHP InstanceOf는 로컬에서 작동하지만 호스트 서버에서는 작동하지 않습니다.

instanceof은 내 호스트 컴퓨터 (HostEurope, PHP 7)가 아닌 내 컴퓨터 (MAMP Pro, PHP 7.0.13)에서 로컬로 작동합니다. 예를 들어, 완전한 이름을 사용 대신의 is_a

  • 를 사용하여 PHP 5.6
    1. 다운 그레이드 :

      나는 다음 시도 \ 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 ""; 
         } 
        } 
    } 
    

    업데이트 :이

    <?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가 동일한 버전이 아니기 때문에 내게 소식이었습니다. 일반적으로 내가 사용하는 모듈을 포함하여 동기화되어 있습니다.

    또한 내 null 검사가 올바른 PHP가 아닌 것으로 의심되어 문제를 추가 할 수 있습니다.

    1

    instanceof 그것이라고 PHP 너무 필수적인 언어 구조입니다 위의 AdFactory 클래스를 호출하는 코드입니다 실제로 제대로 작동하지 않는 것은 사실상 불가능합니다.

    제공된 코드로는 문제가 발생한 위치를 알 수 없습니다.

    귀하의 온라인 서버에서 읽을 수없는 폴더가 있고 코드에 예상되는 개체 대신 null 값이 생깁니다. 자신에게 물어보십시오 : "그것이 내가 기대하는 대상이 아니라면 무엇입니까?"

    변수가 실제로 무엇에 포함되어 있는지 조사하기 위해 var_dump() 또는 printf()을 사용하면 곧 오류를 발견하게됩니다.

    코드에는 PHPUnit 테스트가 도움이 될 것입니다. 아니면 적어도 코드에서 assert()을 사용하는 것이 좋습니다.

    +0

    @DanFromGermany에게 감사의 말을 전합니다. – Francis