-
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
栏目列表
最新更新
博克-定制图例
博克-注释和图例
Bokeh–添加小部件
向博克图添加标签
将交互式滑块添加到博克图
在 Bokeh 中添加按钮
谷歌、微软、Meta?谁才是 Python 最大的金
Objective-C语法之代码块(block)的使用
URL Encode
go语言写http踩得坑
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
[SQL Server]按照设定的周别的第一天算任意
Linux下定时自动备份Docker中所有SqlServer数
六、Danfo.js 数据可视化
五、plotly.js 数据可视化
四、数据分析、清理、转化
三、Danfo.js 入门
第二部分:使用 Danfo.js 和 Dnotebook 的据分
一、现代 JavaScript 概述
javascript 第一部分:基础知识
零、前言
uni-app开发跨平台小程序开发的诸多坑【转
前端设计模式——桥接模式