fecommerce

第 438 位会员

会员
个人信息
个人简介
Yii2 忠实粉丝
个人成就
  • 发表文章次数 62
  • 发布回复次数 106
  • 个人主页浏览次数 229
yii2 添加变量,Yii::$service,并像组件component那样可以添加单例配置7年前

@forecho [[#1楼](#comment1)](#comment1) 在config里面所有的配置,最后都是当做参数传递给 yii\web\Application($config);

$application = new yii\web\Application($config);
$application->run();

如果不执行:unset($config['services'])], yii\web\Application 就会set,但是它没有services属性,就会报错。

Yii::$app 就是 new yii\web\Application($config); , 代码如下:

 public function __construct($config = [])
    {
        Yii::$app = $this;

new fecshop\services\Application($config['services']); 的原理和上面类似。

public function __construct($config = [])
    {
        Yii::$service 		= $this;
        $this->childService = $config;
    }
对接口和事件概念的深究 -设计模式的依赖颠倒7年前

@ilvsx #7楼 文字上面没有必要那么抠字眼,理解意思,并在你的程序中应用就好,对于业务驱动的公司产品线来说,很少会用接口,基本都是一个人搞一块,乱糟糟的,虽然是面向对象编程,里面的逻辑基本都是面向过程,有的时候一个函数,几百行, 很少使用类变量,都是参数在各个类函数中传来传去。

对接口和事件概念的深究 -设计模式的依赖颠倒7年前

举这么个例子吧。 你定义了一个类,你需要做一个搜索功能,但是你不会写,需要你的同事来完成, 因此,你需要等你同事写完类,然后告诉你各个函数具体做什么的,然后你来调用。然后你在写你后面的逻辑。

你可以以另外一种更加高效的方式,不需要你同事写完搜索功能,你直接定义一个接口,扔给你的同事,让他给你实现这个搜索接口即可。而且这种方式,蛮高效的,你可以先通过定义接口,把整个功能的结构架子给搭起来。

对接口和事件概念的深究 -设计模式的依赖颠倒7年前

@ilvsx #7楼 你在 class A的构造方法里面要添加类型判断,用instance of ,如果Class B没有实现接口 IB, 那么在构造方法中应该要报错的。

结果就是:A定义接口IB , 也就是说,这个接口的存在,是一个条约,是一个规范,是一个协议,这个协议是由A来决定的,实现了这个协议的对象,才可以作为A的一部分,譬如:A是自行车,B是轮子,那么A定义了一个接口,来定义传入的轮子的规范,那么b如果符合这个规范,b就可以作为A的一部分,如果B不符合这个规范,譬如B是汽车轮子的尺寸,强行安装到A上面,就会报错。

如果A不存在,那么接口也就没有了意义。

这是一个思想理念吧。

对接口和事件概念的深究 -设计模式的依赖颠倒7年前

在A中,对B的调用,通过 instance of 判断一下B是否实现了接口,如果没有实现就报错。

对接口和事件概念的深究 -设计模式的依赖颠倒7年前

@ilvsx #4楼 由A依赖B,变成了,A定义接口,让B依赖接口,间接实现B依赖A

php 真正的多线程 pthread7年前

@wlmaaa #4楼 还是蛮实用的。

php 真正的多线程 pthread7年前

@iVanilla #2楼 两码事,不是执行速度快不快的问题,而是并发的问题。

Yii2 自带事件的用法7年前

@yidashi #5楼 和Event 是不一样,这种before after 通过重写,大致实现的结果 和 事件 的作用差不多。

php 真正的多线程 pthread7年前

php的进程是有限的,但是线程可以一次几百个并发执行。多线程比较适合一些,对资源耗费少,但是需要长时间等待的工作, 譬如获取运单号,每一个api可能都要等2秒,如果我有3万个单,单个获取肯定拖死,因此用php的多线程是蛮不错的。

yii2 合并js css的插件。7年前

@forecho #5楼 有时候会这样,好像js的库包多了就会报错。还是有缺陷。

之前magento也有js合并,但是合并了,有一些就不支持,报错。

yii2 多模板路径优先级加载view方式下- js和css 的解决7年前

标注一下:

1 这个是把某个文件夹路径的全部文件publish到@webroot/assets下面 $publishDir = $view->assetManager->publish($fileDir);

2 文件复制到webroot后,生成在webroot的js文件路径(相对),这个把文件注册到view中。 $view->registerJsFile($publishDir[1].'/'.$c['js'],$c['options']);

3 文件复制到webroot后,生成在webroot的css文件路径(相对),这个把文件注册到view中。
$view->registerCssFile($publishDir[1].'/'.$c['css'],$c['options']);

4 2和3注册到view的css和js文件 ,将会在$view->head() $view->endBody()的时候被调用。

yii2 合并js css的插件。7年前

恩,要在初始化的时候执行一部分代码

YII2 Advanced应用怎么改成Basic版的7年前

@iVanilla #7楼 你笨办法解决吧,下载下来一个高级版,一个basic版本,比对下差异,把文件复制一下吧。 如果纯粹为了玩玩。

YII2 Advanced应用怎么改成Basic版的7年前

@iVanilla #4楼 你这样搞,你们老板同意吗?你需要搞两拨人维护,一拨人用yii,一拨人用laravel。维护成本多高 为了快速开发,还要封装,你要做2套封装,多累呀。

对接口和事件概念的深究 -设计模式的依赖颠倒7年前

@Kittyfamous #1楼 容器是依赖注入,一个对象的初始化,依赖于注入的配置,容器是面向的单个对象的初始化。

而接口是两个模块间通信达成的协议。在执行方面可以颠倒依赖关系,

事件是多个模块之间通信的方式。当然事件为了更好的使用,也会使用容器注入配置,进而通过配置添加更多的事件,而不是更改里面的代码,这样,通过配置文件,完成了解耦,或者说松耦合。

yii模块用途--译自自yii core team7年前

另外补充接口的另外的用途,可以做类型判断,譬如:

if ($identity instanceof IdentityInterface) { }

如果一个类继承了接口IdentityInterface,接可以使用instanceof 判断这个类是否实现了这个接口 ,进而可以在程序中做控制,譬如:

./yiisoft/yii2/web/User.php:202: if ($identity instanceof IdentityInterface) {

yii模块用途--译自自yii core team7年前

工作顺序的颠倒: 两个人合作做一个功能,A和B分别做2个模块,A是消费方,B是生产方,原来的先后顺序为: B生产出来一个方法,告诉A调用这个方法,来消费B生产的方法,

变成了:A定义个接口C,然后A使用C接口里面的方法实现了自己的功能,然后把C接口扔给B,让B去实现这个接口。

由生产方做主导的工作顺序,转变成消费方做主导的工作顺序。

yii模块用途--译自自yii core team7年前

文章原文:基本思想就是模块间引入接口来解耦模块的互相访问 不要直接粗暴的使用另一个模块内部的功能

@yiqing

个人理解如下: 我认为这句话有错误歧义,可能,yiqing的意思是:先定义好接口方法,然后实现接口方法,然后A去实现的接口方法拿数据。而不是,A直接做了一个提供数据的方法,B直接调用A提供的方法。

下面我发表一下个人的认知:A的行为 依赖于B的一些方法,但是B还没有开始做,所以,我们先通过接口实现定义各个空的方法,用来拿数据,大致的意思,我用一个比喻形容:A和B是革命党,A是军方,需要用服装,B是生产方,必须等B生产好了,B告知A到哪里拿服装,哪里拿鞋子,A的服装队伍才能去拿衣服,也就是A依赖于B的信息,现在有了契约,A直接告诉B衣服放到哪里,鞋子放到哪里,而且还有相应的生产尺码,A到时候去拿,等B生产好衣服鞋子的时候,按照契约C,直接把衣服和鞋子放到相应的地方,对于A来说,有点皇帝的味道,到了时间,直接去拿衣服鞋子,另外一个比喻:税收就像接口,定义好了大家都要交税,国家就是定义接口的主体,原来是农民B生产了粮食,A去拿粮食,A有点要饭的味道,因为A依赖于B,现在通过税收契约,直接规定B必须上交,不按照接口规定就办了你(报错退出),A有了皇帝的味道。通过这个例子我们可以看到,原来是A依赖B,变成了,A定义C契约(接口),B依赖C,这样由A依赖B,间接实现了B依赖A。这就是接口的作用。在产品设计方面可以颠倒主从依赖关系,有点控制反转的味道。

也就是让两个彼此影响的个人,通过接口,让其依赖相互颠倒

通过调用接口有什么好处呢?看似很啰嗦。我认为好处有如下几点: 1.在程序设计,尤其是产品,如果A依赖于B,A是产品的一部分,譬如用户组件(user component),B是用户自定义(譬如user,User extends ActiveRecord implements IdentityInterface),按照常理,需要B先行,然后A在行动,但是呢?在产品中,我们需要A先行动,B在行动,这就需要A行动的时候,告诉B,你如何如何,这就是接口,告诉B要实现那些方法,A在B没有的情况下直接使用B的方法,然后强制B实现这些方法(通过接口),这样通过契约接口颠倒了依赖,在程序实现上,完成了解耦, 也就是说,接口是使用方定义的,而不是提供方定义的,这个有点像客户让工厂加工某些东西,提供了图纸一样,如果B不按照图纸,A就不验收,就报错退出。 2.个人认为接口一旦存在,就是强制执行,除非法律更改(接口改变),在工作当中,为了扩展,经常的对某些方法进行修改,譬如 方法的参数增加了个数,由于php不想java那样,还可以限制传入的参数类型和返回的类型,所以php的接口限制要弱一些。不过还是比较有效,可以限制开发者脑门一热,方法增加参数,或者把这个函数名改变了。

总结:接口的作用,1:可以解耦,我个人认为更确切的是,接口可以让依赖关系颠倒,原来是a和b的关系(a依赖b),变成了a和c(a定义c),b和c的关系(b依赖c),其中c是接口,通过中间层c,间接让b依赖a,有点控制反转的味道。 2.接口,定义类的某些方法不能更改方法名和方法传入的参数。