-
php Trait基类use trait,本类不use
一 回顾trait使用
https://blog.csdn.net/bushuwei/article/details/103514174
发现之前本人说明很模糊,自己居然不知道为什么
其实这里的$c,就是class B
再次回顾逻辑
Top
二 分析
- self和static区别说的没毛病
- Trait基类use trait,本类不use。那么如果用的new self,则你new 出来的就是 use trait者。如果new static,则因为有继承关系, 它会判断类是否存在(父子会被认为都是同一个static,则不再new),那么,谁先调用instance,那么new出来的就是谁。‘Trait基类use trait,本类不use’->直接‘其实这里的$c,就是class B’是错的。之所以有这个‘幻觉’,是因为单例模式,且static
Top
三 上代码
-
self+单例
12345678910111213141516171819202122232425262728293031323334353637383940414243trait A{
private
static
$instance;
static
function getInstance()
{
if
(!isset(self::$instance)){
self::$instance =
new
self();
}
return
self::$instance;
}
}
class
B{
use A;
function a()
{
var_dump(
'call at B'
);
}
}
class
C extends B{
function a()
{
var_dump(
'call at c'
);
parent::a();
}
}
class
D extends B{
use A;
function a()
{
var_dump(
'call at D'
);
parent::a();
}
}
$b = B::getInstance();
$c = C::getInstance();
$d = D::getInstance();
$c->a();
echo
"<br/>"
;
$d->a();
echo
"<br/>"
;
string(9) "call at B" string(9) "call at D" string(9) "call at B"
注视掉
1// $b = B::getInstance();<br data-filtered="filtered">结果不变
-
static+单例
12345678910111213141516171819202122232425262728293031323334353637383940414243trait A{
private
static
$instance;
static
function getInstance()
{
if
(!isset(self::$instance)){
self::$instance =
new
static
();
}
return
self::$instance;
}
}
class
B{
use A;
function a()
{
var_dump(
'call at B'
);
}
}
class
C extends B{
function a()
{
var_dump(
'call at c'
);
parent::a();
}
}
class
D extends B{
use A;
function a()
{
var_dump(
'call at D'
);
parent::a();
}
}
$b = B::getInstance();
$c = C::getInstance();
$d = D::getInstance();
$c->a();
echo
"<br/>"
;
$d->a();
echo
"<br/>"
;
12string
(9)
"call at B"
string
(9)
"call at D"
string
(9)
"call at B"
注视掉
1// $b = B::getInstance();
string(9) "call at c" string(9) "call at B" string(9) "call at D" string(9) "call at B"
-
1
self+非单例
1234567891011121314151617181920212223242526272829303132333435363738394041trait A{
private
static
$instance;
static
function getInstance()
{
self::$instance =
new
self();
return
self::$instance;
}
}
class
B{
use A;
function a()
{
var_dump(
'call at B'
);
}
}
class
C extends B{
function a()
{
var_dump(
'call at c'
);
parent::a();
}
}
class
D extends B{
use A;
function a()
{
var_dump(
'call at D'
);
parent::a();
}
}
$b = B::getInstance();
$c = C::getInstance();
$d = D::getInstance();
$c->a();
echo
"<br/>"
;
$d->a();
echo
"<br/>"
;
12string
(9)
"call at B"
string
(9)
"call at D"
string
(9)
"call at B"
注释掉
1// $b = B::getInstance();
结果不变
-
static+非单例
123456789101112131415161718192021222324252627282930313233343536373839404142434445trait A{
private
static
$instance;
static
function getInstance()
{
// if(!isset(self::$instance)){
// self::$instance = new static();
// }
// return self::$instance;
self::$instance =
new
static
();
return
self::$instance;
}
}
class
B{
use A;
function a()
{
var_dump(
'call at B'
);
}
}
class
C extends B{
function a()
{
var_dump(
'call at c'
);
parent::a();
}
}
class
D extends B{
use A;
function a()
{
var_dump(
'call at D'
);
parent::a();
}
}
$b = B::getInstance();
$c = C::getInstance();
$d = D::getInstance();
$c->a();
echo
"<br/>"
;
$d->a();
echo
"<br/>"
;
12string
(9)
"call at c"
string
(9)
"call at B"
string
(9)
"call at D"
string
(9)
"call at B"
注释掉
$b = B::getInstance();
结果不变
Top
四 结论
- self的话,就是谁use的,就是谁
- static的话,谁调用的就是谁
- 但是static会出现‘谁use就是谁’的幻觉,那是因为单例模式,前面创建了相同类型的单例。
出处:https://www.cnblogs.com/bushuwei/p/17277267.html
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式