Php 7 PHP InstanceOf在本地工作,但不在主机服务器上工作
我对PHP7的instanceof语句有一个问题,它只在某些条件下发生 instanceof似乎在我的开发机器(运行PHP7.0.13的MAMP Pro)上本地工作,但在我的托管服务器(HostEurope,PHP7)上不工作 我尝试了以下方法:Php 7 PHP InstanceOf在本地工作,但不在主机服务器上工作,php-7,instanceof,processwire,Php 7,Instanceof,Processwire,我对PHP7的instanceof语句有一个问题,它只在某些条件下发生 instanceof似乎在我的开发机器(运行PHP7.0.13的MAMP Pro)上本地工作,但在我的托管服务器(HostEurope,PHP7)上不工作 我尝试了以下方法: 降级到PHP5.6 使用是一种替代 使用完全限定名,例如。\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 "";
}
}
}
instanceof
是一种对PHP非常重要的语言结构,实际上不可能不正常工作
您提供的代码不足以说明问题可能发生在何处
很可能,您的在线服务器上有一个无法读取的文件夹,只需在某个地方获取一个null
值,而不是代码中预期的对象。扪心自问:“如果它不是我期望的对象,那它还有什么?”
使用var\u dump()
或printf()
调查变量实际包含的内容,您很快就会发现错误
对于您的代码,PHPUnit测试将是一个好处,或者至少在代码中到处使用assert()
。结果表明,我对Processwire CMS进行的一个API调用中存在错误
$ad = wire(pages)->get("/ads/")->children->getRandom();
我的Processwire本地和服务器实例的版本不一样,这对我来说是新闻。我通常有它的同步,包括我使用的任何模块
我还怀疑我的null检查不正确,这又增加了问题。这与代码中使用的名称空间有关:
本地(没有名称空间的代码)我使用了这个,工作正常:
if ($xmlornot instanceof SimpleXMLElement) { }
但是在服务器上(使用名称空间的代码),只有这样做有效:
if ($xmlornot instanceof \SimpleXMLElement) { }
另请参见此问题/答案:您可以始终使用“get_class()”来获取对象的实际类。看看是什么例子
if ($xmlornot instanceof \SimpleXMLElement) { }