2017-03-02 3 views
0

J'ai un problème avec l'instruction instanceof de PHP 7 qui ne se produit que sous certaines conditions.PHP InstanceOf fonctionne localement mais pas sur le serveur hôte

Il semble que instanceof fonctionne localement sur ma machine de développement (MAMP Pro exécutant PHP 7.0.13) mais pas sur mon serveur hébergé (HostEurope, PHP 7).

J'ai essayé ce qui suit:

  1. à PHP 5.6 dévalorisation
  2. en utilisant is_a au lieu
  3. utilisant le nom complet par exemple \ Site \ Ad

mais ils présentent tous le même comportement.

J'ai essayé Google "instance PHP ne fonctionne pas" et les variations de celui-ci, mais je n'ai rien trouvé de pertinent.

Je me demandais si quelqu'un avait expérimenté quelque chose de similaire ou de solutions possibles à essayer?

Le code en question est:

<?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 ""; 
     } 
    } 
} 

Mise à jour: Voici le code qui appelle la classe AdFactory ci-dessus

<?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

Vous pouvez toujours utiliser 'get_class()' pour obtenir la classe réelle de l'objet. Voir quelle instance il est –

Répondre

0

Il s'avère qu'il y avait un bug dans l'un des appels d'API que je faisais au CMS Processwire. Et mon instance locale et serveur de Processwire n'était pas la même version, ce qui était une nouvelle pour moi. Je l'ai normalement synchronisé, y compris tous les modules que j'utilise.

Je soupçonne également ma vérification nulle n'est pas correct PHP, pour ajouter au problème.

1

instanceof est une construction linguistique qui est si essentiel à PHP qu'il est de facto impossible de ne pas fonctionner correctement.

Le code que vous avez fourni n'est pas suffisant pour indiquer où le problème peut se produire.

Les chances sont, vous avez un dossier non lisible sur votre serveur en ligne et simplement obtenir quelque part une valeur null au lieu d'un objet attendu le long de votre code. Demandez-vous: "Si ce n'est pas l'objet que je m'attends, quoi d'autre est-il?"

Utilisez var_dump() ou printf() pour déterminer ce que vos variables contiennent réellement et vous trouverez l'erreur bientôt.

Pour votre code, les tests PHPUnit seraient un avantage, ou au moins l'utilisation de assert() ici et là dans votre code.

+0

Merci @DanFromGermany pour vos suggestions. – Francis