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

时间:2017-03-02 10:29:08

标签: php-7 instanceof processwire

我在PHP 7的 instanceof 语句中遇到问题,该问题仅在某些情况下发生。

似乎 instanceof 在我的开发机器(运行PHP 7.0.13的MAMP Pro)上本地工作,但在我的托管服务器(HostEurope,PHP 7)上没有。

我尝试了以下内容:

  1. 降级到PHP 5.6
  2. 使用 is_a 代替
  3. 使用完全限定名称,例如\网站\广告
  4. 但它们都表现出相同的行为。

    我试过谷歌搜索" PHP实例不工作"它的变化,但我找不到任何相关的东西。

    我想知道是否有人经历过类似或可能的解决方案尝试?

    有问题的守则是:

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

3 个答案:

答案 0 :(得分:1)

instanceof是一种语言结构,它对PHP非常重要,事实上不可能无法正常工作。

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

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

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

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

答案 1 :(得分:0)

原来我在为Processwire CMS进行的一次API调用中存在一个错误。

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

我的Processwire的本地和服务器实例不是同一个版本,这对我来说是新闻。我通常将它同步,包括我使用的任何模块。

我还怀疑我的空检查是不正确的PHP,以添加问题。

答案 2 :(得分:0)

它与代码中使用的命名空间有关:

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

if ($xmlornot instanceof SimpleXMLElement) { }

但是在服务器(具有命名空间的代码)上只有这个有效:

if ($xmlornot instanceof \SimpleXMLElement) { }

另请参阅此问题/答案:instanceof operator returns false for true condition

相关问题