PHP InstanceOf在本地工作,但不在主机服务器上
我有一个PHP 7的instanceof语句的问题,这个语句只在某些条件下发生。PHP InstanceOf在本地工作,但不在主机服务器上
instanceof似乎在我的开发机器(MAMP Pro运行PHP 7.0.13)本地工作,但不在我的托管服务器(HostEurope,PHP 7)。使用is_a代替
- 降级到PHP 5.6
- :
我曾尝试以下\网站\广告
但他们都表现出相同的行为。
我试过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 "";
}
}
我发现Processwire CMS的API调用中有一个错误。
$ad = wire(pages)->get("/ads/")->children->getRandom();
而我的ProcessWire的本地和服务器实例不是相同的版本,这是我的新闻。我通常会同步它,包括我使用的任何模块。
我也怀疑我的空检查是不正确的PHP,增加了问题。
instanceof
是一个语言结构是如此的重要,以PHP,这是代码事实上不可能不正常工作。
您提供的代码不足以说明问题的发生位置。
很可能是,您的文件夹在您的在线服务器上不可读,并且只是在您的代码中获取某个值,而不是预期的对象。问问自己:“如果它不是我期望的对象,那还有什么?”
使用var_dump()
或printf()
调查你的变量实际包含什么,你很快就会发现错误。
对于您的代码,PHPUnit测试将是一个好处,或者至少在您的代码中使用assert()
。
感谢@DanFromGermany的建议。 – Francis
您总是可以使用'get_class()'来获取对象的实际类。看看它是什么实例 –