为何这个 Lock 类一创建对象就自动上锁?

2014-10-14 11:58:10 +08:00
 jacob

上代码,这代码一运行就执行了$aLock->lock(); 根本就没有这条语句好吗。

class Lock {
      private $isLocked=false;

      public function unlock(){
        $this->isLocked=false;
        echo "You unlocked the Lock"."<br />";
      }

      public function lock(){
        $this->isLocked=true;
        echo "You locked the Lock"."<br />";
      }

      public function isLocked(){
        return $this->isLocked;
      }

    }

      $aLock=new Lock();
      var_dump($aLock->isLocked());
Error: language “PHP” is not supported
2868 次点击
所在节点    PHP
12 条回复
minbaby
2014-10-14 12:14:47 +08:00
因为你的类名叫做 lock
同时你还有个叫做 lock 的方法
php 以兼容 php4 把你的 lock 当成构造函数了
jacob
2014-10-14 12:18:21 +08:00
@minbaby

竟然不区分大小写- -
jacob
2014-10-14 12:28:52 +08:00
@minbaby


那这个构造函数是什么意思呢?它的参数放入一个Lock类,那是把Lock类赋值给Door的$lock了吗?

class Door{
private $lock;
private $connectsTo;

public function __construct(Lock $lock){
$this->lock = $lock;

}
}
minbaby
2014-10-14 12:50:50 +08:00
@jacob 跟方法名相同已经不推荐使用,那是 php4.x 时候的用法, 现在使用__construct
jacob
2014-10-14 12:56:23 +08:00
@minbaby

无语了,我在stackoverflow上看的答案,结果全是错误,包括我3楼的代码,那个构造函数根本不合法。
minbaby
2014-10-14 12:58:47 +08:00
@jacob 不知道你在哪里尝试不合法, 这种写法是正确的, 我验证了下没问题
jacob
2014-10-14 13:51:21 +08:00
@minbaby 我用的wamp环境,提示__construc参数必须是lock实例。
minbaby
2014-10-14 14:09:10 +08:00
@jacob 呵呵, 看点基础吧
jacob
2014-10-14 14:26:39 +08:00
@minbaby 就是看基础呢,php mysql web程序开发第四版。刚看到这部分,参数类型提示。
anewg
2014-10-14 15:37:30 +08:00
wamp提示的原因是你 Door 类的构造函数需要 Lock 类实例传入。跟 Lock 自身没关系
holystrike
2014-10-14 15:46:18 +08:00
@jacob PHP函数名不区分大小写,变量名要区分,我觉得算是历史遗留问题。

为了好习惯和易读性,所以要自行脑区分,写出来的代码也自己区分一下

构造函数就是当你实例化这个类的时候,一定会首先执行一遍。
kankana
2014-10-14 16:46:42 +08:00
$lock = new Lock();
$door = new Door($lock);

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/138813

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX