这个问题并不是寻找解决方案的问题,更多的只是一个简单的好奇心问题.PHP uniqid函数有一个更多的熵标志,使输出"更独特".这让我想知道,当more_entropy为真时,这个函数有多大可能产生相同的结果,而不是.换句话说,启用more_entropy与禁用more_entropy时,uniqid的唯一性如何?启用more_entropy是否有任何缺点?
我在PHP 7中使用返回类型提示遇到了一些问题.我的理解是提示: self意味着你打算让一个实现类返回自己.因此我: self在我的界面中使用来表示,但是当我尝试实际实现接口时,我遇到了兼容性错误.
以下是我遇到的问题的简单演示:
interface iFoo
{
public function bar (string $baz) : self;
}
class Foo implements iFoo
{
public function bar (string $baz) : self
{
echo $baz . PHP_EOL;
return $this;
}
}
(new Foo ()) -> bar ("Fred")
-> bar ("Wilma")
-> bar ("Barney")
-> bar ("Betty");
Run Code Online (Sandbox Code Playgroud)
预期的产出是:
弗雷德威尔玛巴尼贝蒂
我实际得到的是:
PHP致命错误:声明Foo :: bar(int $ baz):Foo必须与iFoo :: bar(int $ baz)兼容:第7行的test.php中的iFoo
问题是Foo是iFoo的一个实现,所以据我所知,实现应该与给定的接口完全兼容.我可以通过更改接口或实现类(或两者)来修复此问题,以通过名称而不是使用返回提示接口self,但我的理解是语义上self意味着"返回您刚刚调用方法的类的实例" ".因此,将其更改为接口意味着理论上我可以返回实现接口的任何实例,而我的意图是调用实例将返回的内容.
这是PHP的疏忽还是这是一个刻意的设计决定?如果它是前者有任何机会看到它在PHP 7.1中修复?如果没有,那么正确的返回提示是什么,你的界面希望你返回刚刚调用方法的实例进行链接的正确方法是什么?
注意: MCrypt支持的库依赖于多年未更新,MCrypt不应再被视为加密数据的可行或安全方法.更重要的是,这个Mcrypt已被弃用,在PHP 5中,而且完全在PHP 7.删除如果您有运行的mcrypt你应该重构它使用更现代化的加密库的任何代码.
有谁知道为什么这个错误信息:(Call to undefined function mcrypt_encrypt() )当我在下面运行以下代码时显示?
我错过了一些步骤,也许在这个代码可以工作之前我必须做的任何设置?
$key = 'password to (en/de)crypt';
$string = 'string to be encrypted';
$test = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key),
$string, MCRYPT_MODE_CBC, md5(md5($key)));
Run Code Online (Sandbox Code Playgroud) 我一直在为我的新工作学习Zend及其MVC应用程序结构,并发现使用它只是困扰我,原因是我无法完全理解.然后在学习过程中,我遇到了一些文章,如MVC:No Silver Bullet以及关于MVC和Web应用程序主题的播客.播客中的那个人对MVC作为一个Web应用程序架构提出了非常好的理由,并且扼杀了许多让我烦恼的东西.
但问题仍然存在,如果MVC不适合Web应用程序,那么它是什么?
我一直在研究那些打算与对象一起使用的代码,而不是真正关心对象的类型.我想输入提示,正在编写的方法需要任何类型的对象,但遇到了一些困难.
我试过function myFunc (object $obj),function myFunc (stdClass $obj)但当我尝试传递对象时,这两个都会产生错误:
可捕获致命错误:传递给MyClass :: MyFunc()的参数1必须是对象的实例,给出ObjectActualClass的实例
同样的事情发生stdClass,以及
我错过了什么?我认为所有未明确继承自另一个类的类继承自stdClass,这意味着PHP中每个类的基类都是stdClass.这不是这种情况吗?
我正在研究代码来管理一系列独特的对象.这段代码的第一个原型使用了一个关联数组,基本上就像我一直这样做的那样.
但是,我也热衷于利用已经添加到更现代版本的PHP中的功能,例如SplObjectStorage来实现这一目的,部分原因在于学习体验,部分原因在于它必然会提供优势(我已经看到基准测试表明在很多情况下,SplObjectStorage可以比数组更快.
当前实现有一个关联数组,我在in_array中检查它是否在向对象添加新对象之前是否已经在数组中.
最大的问题,我可以SplObjectStorage看到的是,它似乎并没有(乍)支持键/值关联数组的行为,只能被视为一个索引数组.但是,PHP较新功能的文档不符合语言中较为成熟的部分的文档标准,我可能只是遗漏了一些东西.
我可以使用SplObjectStorage代替关联数组吗?如果是这样,我如何在添加新对象时定义键?更重要的是,与关联数组相比,SplObjectStorage的相对优势和劣势是什么?
当您继承对象并希望扩展初始化代码时,有两种方法.覆盖__construct(),并实现超类构造函数调用的初始化方法.
方法1:
class foo
{
public function __construct ($arg1, $arg2, $arg3)
{
// Do initialization
}
}
class bar extends foo
{
public function __construct ($arg1, $arg2, $arg3)
{
parent::__construct ($arg1, $arg2, $arg3);
// Do subclass initialization
}
}
Run Code Online (Sandbox Code Playgroud)
方法2
class foo
{
public function init ()
{
// Dummy function
}
public function __construct ($arg1, $arg2, $arg3)
{
// Do subclass defined initialization
$this -> init ();
// Do other initialization
}
}
class bar extends foo
{
public …Run Code Online (Sandbox Code Playgroud) 假设我有一个包含私有属性和相关公共getter和setter的类.我想用PHPUnit测试,在使用setter之后属性获取正确的值,或者getter返回正确的属性.
当然,我可以通过使用getter来测试setter,看看对象是否存储了正确的值,反之亦然,以便测试getter.但是,这并不能保证私有财产是正在设置的私有财产.
说我有以下课程.我创建了一个属性,getter和setter.但我在属性名称中输入了一个拼写错误,因此getter和setter实际上并没有操纵他们想要操纵的属性
class SomeClass
{
private
$mane = NULL; // Was supposed to be $name but got fat-fingered!
public function getName ()
{
return ($this -> name);
}
public function setName ($newName)
{
$this -> name = $newName;
return ($this);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我运行以下测试
public function testSetName ()
{
$this -> object -> setName ('Gerald');
$this -> assertTrue ($this -> object -> getName () == 'Gerald');
}
Run Code Online (Sandbox Code Playgroud)
我会得到一个通行证.然而,实际上发生了一件非常糟糕的事情,我不想要.当调用setName()时,它实际上在类中创建了一个新属性,其名称我认为我的私有属性,只有setter创建的属性是公共的!我可以使用以下代码演示:
$a = new SomeClass;
$a -> setName('gerald');
var_dump ($a -> getName ()); …Run Code Online (Sandbox Code Playgroud) 可能是一个愚蠢的问题,但是如何阻止表单中的选择元素在单击时显示其下拉菜单?我尝试了以下方法:
$('select').click (function (e) {
console.log (e);
return false;
});
Run Code Online (Sandbox Code Playgroud)
和
$('select').click (function (e) {
e.preventDefault ();
console.log (e);
});
Run Code Online (Sandbox Code Playgroud)
但都没有奏效.
我究竟做错了什么?
编辑:我需要知道的原因是jquery增强的select元素需要优雅地降级.想法是选择,当点击时,打开一个jquery UI对话框,其中包含一个用户可以选择的精确填充列表(单击列表项会导致select的值更新).如果JS被禁用,则select应该正常运行.
问题是,除了打开对话框之外,还会出现下拉列表,这不是我想要的.我不能只是禁用控件,因为它的值需要与表单的其余部分一起提交.
我是使用MySQL的新手,我需要在学校下载它,但是,我一直收到此错误消息(如下图所示).我正在使用xampp并使用用户名root连接.港口也与它告诉我的相符.它会让我继续,但很多功能都缺失了.任何帮助都将不胜感激.
检测到不兼容/非标准服务器版本或连接协议(10.0.10).
可以建立与此数据库的连接,但由于数据库与支持的MySQL版本不完全兼容,因此某些MySQL Workbench功能可能无法正常工作.
MySQL Workbench是针对MySQL Server版本5.1,5.5,5.6和5.7开发和测试的

php ×8
oop ×2
type-hinting ×2
architecture ×1
events ×1
forms ×1
interface ×1
javascript ×1
jquery ×1
mcrypt ×1
mysql ×1
php-7 ×1
phpunit ×1
return-type ×1
spl ×1
subclassing ×1
unit-testing ×1
white-box ×1
workbench ×1