PHP InstanceOf 在本地工作但在主机服务器上不工作
PHP InstanceOf works locally but not on host server
我对 PHP 7 的 instanceof 语句有疑问,它只在特定条件下发生。
似乎 instanceof 在我的开发机器 (MAMP Pro 运行 PHP 7.0.13) 上本地工作,但在我的托管服务器 (HostEurope) 上不工作, PHP 7).
我尝试了以下方法:
- 降级到 PHP 5.6
- 使用 is_a 代替
- 使用完全限定的名称,例如\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 "";
}
}
}
更新:这是调用上述 AdFactory 的代码 class
<?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 "";
}
}
instanceof
是一种语言结构,它对 PHP 来说非常重要,事实上不可能不正常工作。
您提供的代码不足以说明问题可能发生的位置。
很有可能,您的在线服务器上有一个文件夹不可读,只是在某处获取了一个 null
值,而不是代码中的预期对象。问问自己:"If it is not the object I expect, what else is it?"
使用 var_dump()
或 printf()
调查您的变量实际包含的内容,您很快就会发现错误。
对于您的代码,PHP单元测试会有所帮助,或者至少在您的代码中到处使用 assert()
。
事实证明,我对 Processwire CMS 进行的 API 调用中有 1 个存在错误。
$ad = wire(pages)->get("/ads/")->children->getRandom();
而且我的 Processwire 本地实例和服务器实例不是同一版本,这对我来说是个新闻。我通常会同步它,包括我使用的任何模块。
我还怀疑我的 null 检查不正确 PHP,添加到问题中。
它与代码中使用的命名空间有关:
本地(没有命名空间的代码)我用过这个,工作正常:
if ($xmlornot instanceof SimpleXMLElement) { }
但是在服务器上(带有命名空间的代码)只有这个有效:
if ($xmlornot instanceof \SimpleXMLElement) { }
另请参阅此 question/answer:
我对 PHP 7 的 instanceof 语句有疑问,它只在特定条件下发生。
似乎 instanceof 在我的开发机器 (MAMP Pro 运行 PHP 7.0.13) 上本地工作,但在我的托管服务器 (HostEurope) 上不工作, PHP 7).
我尝试了以下方法:
- 降级到 PHP 5.6
- 使用 is_a 代替
- 使用完全限定的名称,例如\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 "";
}
}
}
更新:这是调用上述 AdFactory 的代码 class
<?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 "";
}
}
instanceof
是一种语言结构,它对 PHP 来说非常重要,事实上不可能不正常工作。
您提供的代码不足以说明问题可能发生的位置。
很有可能,您的在线服务器上有一个文件夹不可读,只是在某处获取了一个 null
值,而不是代码中的预期对象。问问自己:"If it is not the object I expect, what else is it?"
使用 var_dump()
或 printf()
调查您的变量实际包含的内容,您很快就会发现错误。
对于您的代码,PHP单元测试会有所帮助,或者至少在您的代码中到处使用 assert()
。
事实证明,我对 Processwire CMS 进行的 API 调用中有 1 个存在错误。
$ad = wire(pages)->get("/ads/")->children->getRandom();
而且我的 Processwire 本地实例和服务器实例不是同一版本,这对我来说是个新闻。我通常会同步它,包括我使用的任何模块。
我还怀疑我的 null 检查不正确 PHP,添加到问题中。
它与代码中使用的命名空间有关:
本地(没有命名空间的代码)我用过这个,工作正常:
if ($xmlornot instanceof SimpleXMLElement) { }
但是在服务器上(带有命名空间的代码)只有这个有效:
if ($xmlornot instanceof \SimpleXMLElement) { }
另请参阅此 question/answer: