This is a collection of questions that come up every now and then about syntax in PHP. This is also a Community Wiki, so everyone is invited to participate in maintaining this list.
It used to be hard to find questions about operators and other syntax tokens.¹
The main idea is to have links to existing questions on Stack Overflow, so it's easier for us to reference them, not to copy over content from …
可能重复:
参考 - 这个符号在PHP中意味着什么?
我想知道@PHP语言是什么意思.我见过有人在用
$connect = @mysql_query('sql query here');
Run Code Online (Sandbox Code Playgroud)
不知道为什么.有人可以帮我解释一下吗?
现在我的页面看起来像这样:
if($_GET['something'] == 'somevalue')
{
$output .= 'somecode';
// make a DB query, fetch a row
//...
$row = $stmt->Fetch(PDO::ASSOC);
if($row != null)
{
$output .= 'morecode';
if(somethingIsOK())
{
$output .= 'yet more page output';
}
else
{
$error = 'something is most definitely not OK.';
}
}
else
{
$error = 'the row does not exist.';
}
}
else
{
$error = 'something is not a valid value';
}
if($error == '') // no error
{
//display $output on …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Phar打包我的Web应用程序(Symfony 2项目).我成功地在一个合理的时间内(1-2分钟)打包了一个带有数百个文件的微框架Silex.
问题在于我的开发机器(i7 4770k,16GB,SSD Raid 0,RAM磁盘上的项目)创建存档非常慢,每个文件需要大约1秒.我真的需要找到一种方法来加快速度.
单次迭代读取/加载文件很慢.我正在使用以下方法添加文件:
function addFile(Phar $phar, SplFileInfo $file)
{
$root = realpath(__DIR__.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR);
$path = strtr(str_replace($root, '', $file->getRealPath()), '\\', '/');
$phar->addFromString($path, file_get_contents($file));
}
$phar = new Phar(/* ... */);
$phar->startBuffering();
// ...
foreach ($files as $file) {
addFile($phar, $file);
}
// ...
$phar->setStub(/* ... */);
$phar->stopBuffering();
Run Code Online (Sandbox Code Playgroud)
如何加快阅读/添加文件的速度?可能是我的操作系统(Windows)的问题?
编辑:禁用缓冲并没有解决问题.从字符串添加相同的速度:
// This is VERY fast (~ 1 sec to read all 3000+ files)
$strings = array();
foreach ($files as $file) {
$root = realpath(__DIR__.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR);
$path = …Run Code Online (Sandbox Code Playgroud) 我已经压制了很长一段时间的通知而没有任何问题,但我开始怀疑我是否正在做正确的事情.我似乎无法找到任何合理的理由,为什么我不应该只是压制它们,但其他人似乎认为使用error_reporting来抑制它们是一件可怕的事情,但为什么呢?
我能找到的最接近答案的是这个问题,但这仍然远远不是我正在寻找的答案.隐藏PHP生成的所有通知是否存在某种无法预料的缺点?例如,要将POST调用中的变量包含回表单中,因为存在错误,我只需使用:
<?= $_POST['variable'] ?>
Run Code Online (Sandbox Code Playgroud)
这将生成PHP通知.要解决这个问题,我可以使用这样的东西:
<?= isset($_POST['variable']) ? $_POST['variable'] : '' ?>
Run Code Online (Sandbox Code Playgroud)
但是,这真的有必要吗?我的代码实际上是否会从中获益,而不仅仅是回显变量是否存在并可能创建PHP通知?在我看来,能够忽略通知是使用PHP的好处,因为您不必担心变量是否被定义,特别是对于这样的例子,它似乎并不重要.
我还利用PHP的能力根据它的使用方式自动更改变量的类型/转换,你经常会找到如下代码片段:
for ($i = 0; $i < $limit; $i++) $results[] = $i; // Example
Run Code Online (Sandbox Code Playgroud)
这里$results以前没有定义的,而是变成一个数组,当我尝试一个新的项目添加到它作为一个阵列.我更喜欢这样做,因为如果没有结果添加到数组并且我需要存储该信息或者出于任何原因将其转换为JSON,那么将不会定义该特定变量,从而节省额外的带宽,即使它是分钟.
$data = stdClass; // For reference, in my case this would be defined before this code
$data->results = array();
$limit = 0;
for ($i = 0; $i < $limit; $i++) $data->results[] = $i;
print json_encode($data);
// {"results":[]}
Run Code Online (Sandbox Code Playgroud)
与
$data = stdClass; // For reference
$limit …Run Code Online (Sandbox Code Playgroud) 用什么 <?php echo @$fnameerror; ?>意思.为什么在php中使用@之前的变量
背景:假设我有以下显然不正确的PHP:
try{
$vtest = '';
print(array_pop($vtest));
}catch(Exception $exx){}
Run Code Online (Sandbox Code Playgroud)
为了使用array_pop,$ vtest显然应该是一个数组,而不是一个字符串.然而,当我运行此代码时,会显示警告.我不希望这样,我只是希望代码无声地失败.
问题:与其他语言相比,PHP try-catch是否有一些特殊之处导致这种情况无效?
免责声明: 仅供参考,确实有其他方法可以在PHP中处理这种情况,但这些都是不可取的.这里的目标是避免:
"签名"技巧:
$vtest = '';
print(@array_pop($vtest)); // <-- would like to avoid this
Run Code Online (Sandbox Code Playgroud)
类型铸造:
$vtest = '';
$vtest = (array)$vtest;
print(array_pop($vtest));
Run Code Online (Sandbox Code Playgroud) 您好我正在打这个电话:
$parts = $structure->parts;
Run Code Online (Sandbox Code Playgroud)
现在$ structure只在特殊情况下有部分,所以调用返回null.这对我很好,我的代码后面有一个if($ parts){...}.不幸的是,在代码运行完毕后,我收到此消息:
注意:未定义的属性:stdClass :: $ parts in ...
我怎么能压制这个消息?
谢谢!