奋斗de小蜗牛
只是写了思路并没有去完善代码报错也正常
qq_打酱油
感觉没有多态喃?
就是用了interface,然后都去implements这个接口
慕先生4616747
PHP本身允许一个文件放多个类。用到IDatabase接口的同时,Database类也被使用,autoload函数的存在,可以保证Database.php被require。
一个文件多个类是不好的编程习惯。
职业第三者
路径的问题 检查一下路径是否有错误 下面的报错很清楚了,在你 Loader.php 第15行去加载了一个不存在的文件
Darkspirit暗灵
适配器的概念你可能没有理解 ,举个简单的例子,session的缓存 可以由 file mysql redis memcache 多种实现,但是为了session的操作 无非 set get ,适配器是定制一套统一的操作方法,由底层去实现 即为适配器
Weicong
可以,因为他们三只调用了IDatabase接口,并没有用到Database。php
这不是个bug
一句话:感觉接口没什么用?这难道是新人都会感觉到的问题?
qq_工作_3
我们假想命名空间是班级名称,类名是学生姓名,那么,你在走廊喊一声张三,会有几个人回应你,假如有两个班都有张三,那么namespace就相当于说给张三限定他班级名称,而use就是你喊张三时,指明喊得哪个张三,这句话的意思就是,PDO这个类是COMMON\Database这个班级的。我们会用到COMMON班的IDatabase同学来帮忙。
慕粉3655057
为什么这么说?
wangzixue
适配器是为了统一调用吧,定义统一的约定规范实现方式。
王益达
\是根命名空间,不加会在当前命名空间中查找是否含有PDO类
yubest
工厂模式是负责加工的,适配器模式包括工厂模式,比工厂模式又高了一点点,增加了统一的抽象接口定义,方便以后在不同的数据库切换而不用改底层代码
鲨鱼小王子
这个原理跟JDK差不多
liudaxingtx
不太准确。其实可以在DataBase类中根据配置再封装一层,比如假设配置的mysql,那么DataBase的connect就去new Mysql()->connect,如果是mysli,就去执行new Mysqli()->connect()
eyanguh
慕妹3204832
直接new对象和注册树是一样的,注册树不过是把已生成的对象保存在数组的一个键值中,便于管理罢了。只要是对象或者资源类型,都可以放到注册树中。
阿布罗狄
没错,就是这样。以下就是我的代码
<?php
namespace imooc;
interface Idatabase
{
function connect($host,$user,$pass,$dbname);
function query($sql);
function close();
}
手机用户曾小乱
这么理解也对。类似于手机电源适配器,如果能用一个充电器对所有手机充电当然是最方便的。无论什么手机,都只需要拿一个充电器。否则,不同手机不同充电器,太麻烦。
通过适配器,封装变化,通过一个接口能调用多个不同接口的对象。这样调用时比较简单。而当对象接口变化时,原来的调用代码可以不变(只需要修改适配器就行了)。
沧海一书
对,不单独写的话,加载文件就会报错,我也遇到了。会加载 IDatabase.php 文件,这个文件根本没有的
云枫Go
use的使用方法建议看php.net官方的手册。
http://php.net/manual/zh/language.namespaces.importing.php
mc²
对于psr-0来说interface IDatabase应该不能和类Database写在相同的文件中,不然使用use Server\Idatabase 会去调用Server\Idatabase.php文件,而Server\Idatabase.php文件并不存在,所以报错。