我想知道PHP引擎解释函数声明的顺序.我不知道为什么某些PHP显示调用未定义的函数致命错误和somethimes解释器看到函数没有问题.
我们假设我的代码是:
echo theRest(4,3);
function theRest($a, $b)
{
return $a % $b;
}
Run Code Online (Sandbox Code Playgroud)
看到调用后声明了该函数,这是正常的.这意味着PHP在解释之前读取整个文件?
另一个例子:
echo theRest(4,3);
include('test2.php');
Run Code Online (Sandbox Code Playgroud)
test2.php
function theRest($a, $b)
{
return $a % $b;
}
Run Code Online (Sandbox Code Playgroud)
这里我得到致命错误:调用未定义函数theRest().这是为什么?
我正在尝试将数组转换为对象.我想使用魔术方法 - 带有静态属性的__get和__set.
我的代码:
class UserData {
private static $id, $name, $login;
public function __get($var)
{
return self::$var;
}
public function __set($var, $val)
{
self::{$var} = $val;
}
}
Run Code Online (Sandbox Code Playgroud)
并设置:
foreach($userArray as $key => $val)
{
DaneBilingowe::${$key} = $val;
}
Run Code Online (Sandbox Code Playgroud)
错误:致命错误:无法访问私有属性UserData :: $ id
是否可以使用具有静态属性的魔术方法?
我创建了一个非常大的导入脚本,它将产品从CSV导入到magento.我还有一个要解决的问题.
我使用下拉列表来表示属性.不幸的是,我无法为单个产品设置这些属性的值.我做了什么:
我尝试了几种方法,这是一个看起来对我好的方法:
private function setOrAddOptionAttribute($product, $arg_attribute, $arg_value) {
$attribute_model = Mage::getModel('eav/entity_attribute');
$attribute_options_model = Mage::getModel('eav/entity_attribute_source_table');
$attribute_code = $attribute_model->getIdByCode('catalog_product', $arg_attribute);
$attribute = $attribute_model->load($attribute_code);
$attribute_options_model->setAttribute($attribute);
$options = $attribute_options_model->getAllOptions(false);
// determine if this option exists
$value_exists = false;
foreach($options as $option) {
if ($option['label'] == $arg_value) {
$value_exists = true;
break;
}
}
// if this option does not exist, add it.
if (!$value_exists) {
$attribute->setData('option', array(
'value' => array(
'option' => array($arg_value,$arg_value)
)
));
$attribute->save();
} …Run Code Online (Sandbox Code Playgroud) 我必须从字符串中取出一些数据.不幸的是,数据的格式非常不友好.我不得不在单独的preg_replace中创建大约15个regural表达式.值得一提的是,它们内部有很多OR(|).我的问题是我最终应该做什么:将所有表达式合并为一个并使用|将它们分开 或保留原样 - 在个人preg_replace?
创建其他表达式以保持清晰度是非常糟糕的做法吗?我想也许我可以将一些表达结合到一个表达中,但它们变得非常复杂而且不能理解.
例如,我有:
$itemFullName = preg_replace("@^\b(([a-zA-Z]{1,3})?[0-9]{1,2}(\.|\-|X)[0-9]{1,2}(\s|\.|\-)?(X|x)?\s?[0-9]{1,3}\.?(([0-9]{1,3})?(X[0-9]{1,3})|(\s[0-9]\/[0-9]|\/[0-9]{1,3}))?(\s\#[0-9]{1,3}\/[0-9]{1,3})?)\s@", ' ', $itemFullName, -1, $sum);
Run Code Online (Sandbox Code Playgroud) 我正在创建相当大的导入脚本.我想看到任何有问题的(未执行的)SQL查询.使用try-catch PHP块捕获错误的SQL查询时遇到问题.
我有一个问题:
SELECT id FROM tag WHERE name IN ()
Run Code Online (Sandbox Code Playgroud)
当然它有一个错误,所以我想用这段代码打印这样的查询:
$sql = "SELECT id FROM tag WHERE name ".$tagsSql."";
try
{
$query = mysqli_query($this->mysqli, $sql);
$result = $query->fetch_assoc();
}
catch(Exception $e)
{
echo 'Problem with: '.$sql;
print_r($e); die;
}
Run Code Online (Sandbox Code Playgroud)
运行脚本时,PHP只会抛出这个:
Fatal error: Call to a member function fetch_assoc() on a non-object in C:\www\blackboard-import\index.php on line 227
Run Code Online (Sandbox Code Playgroud)
为什么没有抓住这个错误?因为这是致命的?我该如何处理这种情况?我使用mysqli与MySQL联系.
我正在查询数据库,然后使用file_put_contents()将返回的数据存储到XML文件中.我想知道调用这个函数的方法更好.请注意,$ data是大数组,变量$ rss在这种情况下可以包含一个大字符串.
起初我实现了这样的事情:
foreach($data as $item)
{
$rss .= '<title>'.getTitle($item['id']).'</title>';
$rss .= '<data>'.getData($item['id']).'</data>.';
file_put_contents($this->fileRss, $rss);
unset($rss);
}
Run Code Online (Sandbox Code Playgroud)
然后我改为:
foreach($data as $item)
{
$rss .= '<title>'.getTitle($item['id']).'</title>';
$rss .= '<data>'.getData($item['id']).'</data>.';
}
file_put_contents($this->fileRss, $rss);
Run Code Online (Sandbox Code Playgroud)
哪种方式更好?制作一个大的,大的变量$ rss,然后保存它或每次保存很小的变量?我不确定,但我认为IO操作比内存操作慢,所以第一种方式更好.唯一的问题可能是内存限制.
php ×6
attributes ×1
class ×1
execution ×1
io ×1
magento ×1
mysql ×1
mysqli ×1
performance ×1
preg-replace ×1
regex ×1
sql ×1
static ×1
try-catch ×1
workflow ×1