我正在编写一个简单的逻辑用于测试目的。当调用一个动作方法时,我抓住作为参数传递给动作的id并将其存储在一个关联数组中。我写了一个静态函数来处理逻辑。我还有第二个问题,我想检查id是否已作为关联数组中的键存在,如果是,我想增加计数器。但我可以为这个问题打开另一个问题。这个问题的目的是静态变量不起作用。
class UsersController extends Controller
static $users= Array();
public function show( $id)
{
$this::stats($id);
}
private static function stats($id)
{
if( array_key_exists("{$id}", UsersController::$users))
{
UsersController::$users["{$id}"] += 1;
}
else
{
UsersController::$users["{$id}"] = 1;
}
print_r(UsersController::$users);
}
每次访问不同的用户www.example.com/users/2或www.example.com/users/1。 print_r语句显示数组中只存在一个元素。我错过了一些oop原则。我在C#中编写了类似的代码,它的工作方式与预期一致。
答案 0 :(得分:0)
您不会错过任何OOP原则,您错过了PHP流程的标准实现。通常,Web服务器被设计为执行php脚本然后执行死亡。当你访问两个不同的页面时,内存中没有持久性。
你能实现PHP继续使用相同的内存吗?当然可以,但我知道没有这样的网络服务器实现。
大多数人使用会话(服务器端)或cookie(客户端)来保持多个请求中的持久数据。
答案 1 :(得分:-1)
您需要将数据存储在永久存储中以通过多个请求保留。
每个PHP请求都是一个全新的执行。因此,如果它是您的C#代码,就好像您退出C#程序,再次启动它并与第二个用户一起访问。
经常使用PHP的永久存储源包括将其存储在文件,数据库等中的选项。
如果此数据的存储可以是每个用户,如果丢失则不是很大,您可以将其存储在会话中(存储在服务器上,通常存储在文件中)或cookie(存储在客户端的浏览器中)。这些存储介质都不是非常可靠,并且被认为是暂时的。
还有更多临时形式的数据存储,它们包括Memcache(基于独立内存的存储介质),redis(同上),APCu(可以作为模块构建到PHP中)等等。