这两者有什么区别:
use Exception;
use \Exception;
Run Code Online (Sandbox Code Playgroud)
或那些:
use Foo\Bar;
use \Foo\Bar;
Run Code Online (Sandbox Code Playgroud)
该手册说:
请注意,对于名称空间名称(包含名称空间分隔符的完全限定名称空间名称,例如Foo\Bar而不是全局名称,例如FooBar),前导反斜杠是不必要的,不允许,因为导入名称必须是完全限定的,并且不会相对于当前名称空间进行处理.
但我并不是真的理解这一点,因为所有上述变种都有效,即它绝对不是"不允许".
看看zend_do_use
显示,is_global
(设置,当有前导反斜杠时)仅用于以下情况中的警告:
namespace {
use Exception;
}
Run Code Online (Sandbox Code Playgroud)
这告诉我:"具有非复合名称的'使用声明'异常'无效".(虽然做同样的事情use \Exception
会产生很小的影响,但不会发出警告.)
那么:我错过了什么吗?实际上有什么区别吗?
众所周知,现代正则表达式实现(最值得注意的是PCRE)与常规语法的原始概念几乎没有共同之处.例如,您可以解析无上下文语法的经典示例{a n b n ; n> 0}(例如aaabbb
)使用此正则表达式(演示):
~^(a(?1)?b)$~
Run Code Online (Sandbox Code Playgroud)
我的问题是:你能走多远?是否也可以使用PCRE 解析上下文敏感的语法 {a n b n c n ; n> 0}(例如aaabbbccc
)?
我正在寻找一个JQuery Checkbox Treeview.有谁知道一个好的存在吗?
我已经长时间使用了无盐的md5/sha1,但由于这种方法不太安全(并且随着时间的推移变得越来越不安全)我决定切换到盐渍的sha512.此外,我想通过使用许多迭代(例如100)来减慢散列的生成.
我的问题是我是应该在每次迭代时添加盐还是在开始时只添加一次.以下是两个可能的代码:
每次追加:
// some nice big salt
$salt = hash($algorithm, $salt);
// apply $algorithm $runs times for slowdown
while ($runs--) {
$string = hash($algorithm, $string . $salt, $raw);
}
return $string;
Run Code Online (Sandbox Code Playgroud)
追加一次:
// add some nice big salt
$string .= hash($algorithm, $salt);
// apply $algorithm $runs times for slowdown
while ($runs--) {
$string = hash($algorithm, $string, $raw);
}
return $string;
Run Code Online (Sandbox Code Playgroud)
我首先想要使用第二个版本(追加一次)但后来发现每次添加盐的一些脚本.
所以,我想知道每次添加它是否会增加哈希的强度.例如,攻击者是否有可能找到一种聪明的方法来创建一个100XSha512函数,这比简单地执行sha512 100倍?
PHP中的函数调用很昂贵.这是一个测试它的小基准:
<?php
const RUNS = 1000000;
// create test string
$string = str_repeat('a', 1000);
$maxChars = 500;
// with function call
$start = microtime(true);
for ($i = 0; $i < RUNS; ++$i) {
strlen($string) <= $maxChars;
}
echo 'with function call: ', microtime(true) - $start, "\n";
// without function call
$start = microtime(true);
for ($i = 0; $i < RUNS; ++$i) {
!isset($string[$maxChars]);
}
echo 'without function call: ', microtime(true) - $start;
Run Code Online (Sandbox Code Playgroud)
这使用函数first(strlen
)测试功能相同的代码,然后不使用函数(isset
不是函数).
我得到以下输出:
with function …
Run Code Online (Sandbox Code Playgroud) 由于我正在使用服务,这个问题可能最终成为symfony中依赖注入的问题.目前我正试图通过phpunit测试在我的服务中测试一个简单的功能,我不断收到以下错误:
PHP Catchable fatal error: Argument 1 passed to Caremonk\MainSiteBundle\Tests\Services\GeoTest::__construct() must be an instance of Caremonk\MainSiteBundle\Tests\Services\Geo, none given, called in /usr/share/nginx/html/caremonk/vendor/phpunit/phpunit/PHPUnit/Framework/TestSuite.php on line 473 and defined in /usr/share/nginx/html/caremonk/src/Caremonk/MainSiteBundle/Tests/Services/GeoTest.php on line 14
Run Code Online (Sandbox Code Playgroud)
从错误中可以看出,我正在尝试创建我的服务实例并且没有传递正确的参数,所以bellow是我的services.yml文件:
#src/Caremonk/MainSiteBundle/Resources/config/services.yml
parameters:
caremonk_main_site.geo.class: Caremonk\MainSiteBundle\Services\Geo
caremonk_main_site.geo_test.class: Caremonk\MainSiteBundle\Tests\Services\GeoTest
services:
geo:
class: %caremonk_main_site.geo.class%
arguments: []
geo_test:
class: %caremonk_main_site.geo_test.class%
arguments: ["@geo"]
Run Code Online (Sandbox Code Playgroud)
贝娄是我建立的服务:
<?php
//src/Caremonk/MainSiteBundle/Services/Geo.php
namespace Caremonk\MainSiteBundle\Services;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
class Geo extends Controller
{
public $pi80;
public $latRad;
public $lngRad;
public function __construct()
{
$this->pi80 = M_PI / 180;
}
// …
Run Code Online (Sandbox Code Playgroud) PHP 为无效密钥定义了两个SPL异常:
OutOfRangeException
:请求非法索引时抛出异常.这表示应该在编译时检测到的错误.
OutOfBoundsException
:如果值不是有效键,则抛出异常.这表示在编译时无法检测到的错误.
由于PHP不是编译语言,编译时和运行时之间的区别似乎很奇怪,因此我发现很难理解使用哪个例外.
目前我的理解是,一个人应该抛出...
... OutOfRangeException
如果关键是从根本上和本质上畸形,例如,如果一个数组作为重点过去了.
... OutOfBoundsException
如果密钥通常没问题,但不在某些边界,例如,如果100
通过但是50
是最大密钥.
这种理解是否正确?
我想要做的就是404
从PHP 发送状态代码 - 但是以通用的方式.双方Router::statusCode(404)
并Router::statusCode(403)
应工作,以及任何其他有效的HTTP状态代码.
我知道,您可以将状态代码指定为第三个参数header
.可悲的是,这只有在你指定一个时才有用string
.因此,呼吁header('', false, 404)
并没有工作.
此外,我知道,可以通过header
状态行的呼叫发送状态代码:header('HTTP/1.1 404 Not Found')
但要做到这一点,我必须Not Found
为所有状态代码(404
)维护一系列原因短语().我不喜欢这个想法,因为它在某种程度上是PHP已经完成的重复(对于第三个header
参数).
所以,我的问题是:有没有简单而干净的方式在PHP中发送状态代码?
我正在阅读杰夫阿特伍德的文章"PHP糟透了,但它并不重要".
他在评论中写道:
也就是说,我绝对认为PHP开发人员必须了解PHP的架构限制,并了解其他选择.
这些限制是什么?它们与其他脚本/弱类型语言相比如何?
此外,在需要避免限制的情况下,有哪些替代方案?
这够了吗?
session_start(); // Must start a session before destroying it
if (isset($_SESSION))
{
unset($_SESSION);
session_unset();
session_destroy();
}
Run Code Online (Sandbox Code Playgroud)
当用户Log out
从菜单中选择但不退出浏览器时?我想完全删除会话的所有存在和$_SESSION
php ×9
architecture ×1
cryptography ×1
exception ×1
function ×1
header ×1
import ×1
jquery ×1
namespaces ×1
passwords ×1
pcre ×1
regex ×1
security ×1
spl ×1
symfony ×1
treeview ×1
web-services ×1