zc_core/banggood/refactor/cache/structs/brands.php
370行
public function getBrandUrl(
brandid)$curLang=COUNTRYSUBDOMAIN==′ar′?null:$this−>Lang−>currentLang();return$this−>querySection($brandid,RCACHEBRANDSECTIONURL,$curLang);383行publicfunctiongetBrandActivityUrl(
b
r
a
n
d
i
d
)
$
c
u
r
L
a
n
g
=
C
O
U
N
T
R
Y
S
U
B
D
O
M
A
I
N
=
=
′
a
r
′
?
n
u
l
l
:
$
t
h
i
s
−
>
L
a
n
g
−
>
c
u
r
r
e
n
t
L
a
n
g
(
)
;
r
e
t
u
r
n
$
t
h
i
s
−
>
q
u
e
r
y
S
e
c
t
i
o
n
(
$
b
r
a
n
d
i
d
,
R
C
A
C
H
E
B
R
A
N
D
S
E
C
T
I
O
N
U
R
L
,
$
c
u
r
L
a
n
g
)
;
383
行
p
u
b
l
i
c
f
u
n
c
t
i
o
n
g
e
t
B
r
a
n
d
A
c
t
i
v
i
t
y
U
r
l
(
brand_id){
curLang=COUNTRYSUBDOMAIN==′ar′?null:
c
u
r
L
a
n
g
=
C
O
U
N
T
R
Y
S
U
B
D
O
M
A
I
N
=
=
′
a
r
′
?
n
u
l
l
:
this->Lang->currentLang();
return
this−>querySection(
t
h
i
s
−
>
q
u
e
r
y
S
e
c
t
i
o
n
(
brand_id, RCACHE_BRAND_SECTION_ACTIVITY_URL, $curLang);
}
applications/banggood/models/mod_banner/banner.php
199行
if ($curLang != DEFAULT_LANGUAGE && COUNTRY_SUBDOMAIN != ‘ar’){
applications/banggood/models/mod_init/init.php
160行
if (this->curLang != ‘en-GB’ && COUNTRY_SUBDOMAIN != ‘ar’) {
this->curLang != ‘en-GB’ && COUNTRY_SUBDOMAIN != ‘ar’) {
homeUrl .=
this−>curLang[0].
t
h
i
s
−
>
c
u
r
L
a
n
g
[
0
]
.
this->curLang[1].’/’;
}
applications/banggood/models/mod_init/init.php 1773行,世杰已经修改过,但没起作用
首页 ,分类页,搜索页
二级域名去除语种路径/ar/
面向对象的核心概念
对象
- 对象也是一种变量
- 对象和数组比较,两者序列化后可以看出:对象多了一个指针,指向它所属的类。
- 当一个对象的实例变量引用其他对象时,序列化该对象时也会对引用对象序列化。
类是定义一系列属性和操作的模板,对象则把属性具体化,交给类处理。对象就是数据,本身不包含方法,但有一个“指针”
(方便理解)指向类,类里可以有方法。类和对象是不可分割的,有对象就必定有一个类(特殊情况:由标量强制类型转换的
object,没有一个类和它对应,PHP中的一个“寡人”stdClass类收留这个对象)
魔术方法-“语法糖”
__set()和__get()方法
- 两个方法归到重载(动态地“创建”类属性和方法)。
call和callStatic方法
- 防止调用不可访问(如未定义,或不可见)的方法而出错,__call()会被调用
__tostring(PHP中方法不区分大小写,但开发中需规范)
- 如果类中定义了此方法,打印对象时候就会调用此方法
- toString方法也是一种序列化。直接echo一个对象会报错,PHP限制了实现toSTring后即可使用
继承和多态
都是对类的复用,一个是类级别的复用,一个是方法级别的复用。
1.类的继承和组合
组合:定义两个类A和B,在A类中创建B类的对象C,把这个对象C视为A类的一个属性,并调用它的方法处理问题。
继承:父与子关系。
组合偏重整体和局部,继承偏重父与子的关系。编程中使用两者的标准就是低耦合。 耦合是软件结构内不同模块之间
互连程度的度量,也就是不同模块间的依赖程度。低耦合就是尽可能使模块独立,之间的接口尽量少而简单。在二者均可使用
的情况下,更倾向于使用组合。
①继承破坏封装性
如定义鸟类为父类,具有羽毛属性和飞翔方法。其子类天鹅,鸭子等继承鸟类。显然鸭子不需要飞翔方法,但作为子类,它们
却可以无区别使用飞翔方法,这就破坏了封装性。
②继承是紧耦合
父子类捆绑一起。但组合仅通过唯一接口和外部进行通信。
③继承扩展复杂
继承层数增加和子类的增加,将涉及大量方法重写。(所以一般建议继承层数不超过3层)
④不恰当地使用继承可能违反现实世界的逻辑
底层代码多用组合,可以提高效率,避免对象臃肿;顶层/业务层代码多用继承,提高灵活性,业务使用方便。
接口
接口本身不提供实现,只是提供一个规范(PHP中接口可以淡化为设计文档,起到一个团队对基本契约的作用)。PHP是弱类型
,强调灵活,不推荐大规模使用接口。SPL(标准PHP库)实现了一些接口,最主要的就是Iterator迭代器接口,通过实现这个
接口就可以使对象能够用于foreach结构。比如SPL中的DirectoryIterator类,它在继承SplFileInfo类的同时,实现
了Iterator、Traversable、SeekableIterator这三个接口。
Iterator接口的原型:
![这里写图片描述](https://img-blog.csdn.net/20180329115621306?
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FkZTEx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/
gravity/SouthEast)
如果一个类声明了实现Iterator接口,就必须实现这五个方法,如果实现了这五个方法,那么就很容易对这个类的实例进行迭
代。DirectoryIterator之所以能拿来就用,是因为系统以及实现了Iterator接口。(为什么实现了Iterator接口,其对象就可
以被用作foreach对象呢?在对PHP实例对象使用foreach时,会检查这个实例有没实现Iterator接口,如果实现了,就会通过内
置方法或使用实现类中的方法模拟foreach) 所以可以像下面这样使用:
$dir = new DirectoryIterator(dirname(FILE));
foreach($dir as $fielinfo){
if(!$fielinfo->isDir()){
echo $fielinfo->getFilename(),"\t",$fileinfo->getSize(),PHP_EoL;
}
}
接口就是这样本身什么都不做,系统悄悄在内部实现了接口的行为,所以只要实现这个接口,就可以使用接口提供的方法。这
就是接口“即插即用”思想。接口是对多重继承的一种变相实现
反射
面向对象被赋予了自省的能力,这个自省的过程就是反射。
**反射指在PHP运行状态中,扩展分析PHP程序,导出或提取出关于类、方法、属性、参数、注释等的详细信息。这种动态获取
信息以及动态调用对象方法的功能称为反射API。**
$reflect = new ReflectionObject($a);//$a对象
//获取对象属性列表
$pros = $reflect->getProperties();
//获取对象方法列表
$m = $reflect->getMethods();
//获取对象属性列表所属的类
echo get_class($a);
反射API功能显然强大,甚至还能还原这个类的原型,包括方法的访问权限。如下
//反射获取类的原型
$obj = new ReflectionClass('person');
$className = $obj->getName();
$Methods = $Properties=array();
foreach ($obj->getProperties() as $v){
$Properties[$v->getName()] = $v;
}
foreach ($obj->getMethods() as $v){
$Methods[$v->getName()] = $v;
}
echo "class{$className}\n{\n";
is_array($Properties) && ksort($Properties);
foreach ($Properties as $k=>$v){
echo "\t";
echo $v->isPublic() ? 'Public' : '',$v->isPrivate() ? 'Private' : '',$v->isProtected() ? 'Protected' : '',
$v->isStatic() ? 'Static' : '';
echo "\t{$k}\n";
}
echo '\n';
if(is_array($Methods)){
ksort($Methods);
}
foreach ($Methods as $k=>$v){
echo "\tfunction{$k}()\n";
}
echo "}\n";
输出如下:
class person{
public gender
public name
function get(){}
function set(){}
function say(){}
}
PHP手册中关于反射API还有几十个,反射完整的描述了一个类或者对象的原型。反射不仅可以用于类和对象,还可以用于函数
、扩展模块、异常等。
反射的作用
反射可以用于文档生成。因此可以用它对文件里的类进行扫描,逐个生成描述文档。