2020-08-31 01:27:08 +08:00
|
|
|
<?php
|
|
|
|
|
/**
|
|
|
|
|
* Created by PhpStorm.
|
|
|
|
|
* User: whwyy
|
|
|
|
|
* Date: 2018/3/30 0030
|
|
|
|
|
* Time: 14:28
|
|
|
|
|
*/
|
2020-10-29 18:17:25 +08:00
|
|
|
declare(strict_types=1);
|
2020-12-17 14:09:14 +08:00
|
|
|
|
2020-08-31 01:27:08 +08:00
|
|
|
namespace Snowflake\Abstracts;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
use Exception;
|
2020-12-17 14:12:44 +08:00
|
|
|
|
2021-02-23 18:31:30 +08:00
|
|
|
use JetBrains\PhpStorm\Pure;
|
|
|
|
|
use Snowflake\Exception\ComponentException;
|
2020-08-31 12:38:32 +08:00
|
|
|
use Snowflake\Snowflake;
|
2020-08-31 01:27:08 +08:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Class Component
|
2020-08-31 12:38:32 +08:00
|
|
|
* @package Snowflake\Snowflake\Base
|
2020-08-31 01:27:08 +08:00
|
|
|
*/
|
|
|
|
|
class Component extends BaseObject
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @var array
|
|
|
|
|
*/
|
2020-10-29 18:17:25 +08:00
|
|
|
private array $_events = [];
|
2020-08-31 01:27:08 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param $name [事件名称]
|
|
|
|
|
* @param $callback [回调函数]
|
|
|
|
|
* @param array $param [函数参数]
|
|
|
|
|
*
|
|
|
|
|
* {
|
|
|
|
|
* 事件名, 回调, 参数
|
|
|
|
|
* }
|
|
|
|
|
*/
|
|
|
|
|
public function on($name, $callback, $param = [])
|
|
|
|
|
{
|
|
|
|
|
if (isset($this->_events[$name])) {
|
|
|
|
|
array_push($this->_events[$name], [$callback, $param]);
|
|
|
|
|
} else {
|
|
|
|
|
$this->_events[$name][] = [$callback, $param];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param $name
|
|
|
|
|
* @param null $callback
|
|
|
|
|
* @return bool
|
|
|
|
|
*/
|
2021-02-23 18:31:30 +08:00
|
|
|
#[Pure] public function hasEvent($name, $callback = null): bool
|
2020-08-31 01:27:08 +08:00
|
|
|
{
|
|
|
|
|
if (!isset($this->_events[$name])) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if (!is_array($this->_events[$name])) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
foreach ($this->_events[$name] as $event) {
|
|
|
|
|
[$_callback, $param] = $event;
|
|
|
|
|
if ($_callback === $callback) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param $name
|
|
|
|
|
* @param null $event
|
|
|
|
|
* @param array $params
|
|
|
|
|
* @param bool $isRemove
|
|
|
|
|
* @throws Exception
|
|
|
|
|
*/
|
|
|
|
|
public function trigger($name, $event = null, $params = [], $isRemove = false)
|
|
|
|
|
{
|
2021-02-20 13:02:58 +08:00
|
|
|
$aEvents = Snowflake::app()->getEvent();
|
2020-08-31 01:27:08 +08:00
|
|
|
if (isset($this->_events[$name])) {
|
|
|
|
|
$events = $this->_events[$name];
|
|
|
|
|
foreach ($events as $key => $_event) {
|
|
|
|
|
if (!empty($event)) {
|
|
|
|
|
$_event = $event;
|
|
|
|
|
}
|
|
|
|
|
call_user_func($_event, ...$params);
|
|
|
|
|
if ($isRemove) {
|
|
|
|
|
unset($this->_events[$name][$key]);
|
2020-08-31 12:38:32 +08:00
|
|
|
$aEvents->of($name, $_event);
|
2020-08-31 01:27:08 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-08-31 12:38:32 +08:00
|
|
|
$aEvents->trigger($name, $event);
|
2020-08-31 01:27:08 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param $name
|
|
|
|
|
* @param null $handler
|
2020-12-17 14:09:14 +08:00
|
|
|
* @return void
|
2021-02-23 18:31:30 +08:00
|
|
|
* @throws ComponentException
|
2020-08-31 01:27:08 +08:00
|
|
|
*/
|
2020-12-17 14:09:14 +08:00
|
|
|
public function off($name, $handler = NULL): void
|
2020-08-31 01:27:08 +08:00
|
|
|
{
|
2021-02-20 13:02:58 +08:00
|
|
|
$aEvents = Snowflake::app()->getEvent();
|
2020-08-31 01:27:08 +08:00
|
|
|
if (!isset($this->_events[$name])) {
|
2020-12-17 14:09:14 +08:00
|
|
|
$aEvents->of($name, $handler);
|
|
|
|
|
return;
|
2020-08-31 01:27:08 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (empty($handler)) {
|
|
|
|
|
unset($this->_events[$name]);
|
|
|
|
|
|
2020-12-17 14:09:14 +08:00
|
|
|
$aEvents->of($name, $handler);
|
|
|
|
|
return;
|
2020-08-31 01:27:08 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
foreach ($this->_events[$name] as $key => $val) {
|
|
|
|
|
if ($val[0] != $handler) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
unset($this->_events[$name][$key]);
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
2020-12-17 14:09:14 +08:00
|
|
|
$aEvents->of($name, $handler);
|
2020-08-31 01:27:08 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
*/
|
|
|
|
|
public function offAll()
|
|
|
|
|
{
|
|
|
|
|
$this->_events = [];
|
2021-02-20 13:02:58 +08:00
|
|
|
$aEvents = Snowflake::app()->getEvent();
|
2020-08-31 12:38:32 +08:00
|
|
|
$aEvents->clean();
|
2020-08-31 01:27:08 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2020-09-02 15:37:06 +08:00
|
|
|
/**
|
|
|
|
|
* @param $name
|
|
|
|
|
* @param $value
|
|
|
|
|
* @throws Exception
|
|
|
|
|
*/
|
|
|
|
|
public function __set($name, $value)
|
|
|
|
|
{
|
|
|
|
|
if (property_exists($this, $name)) {
|
|
|
|
|
$this->$name = $value;
|
|
|
|
|
} else {
|
|
|
|
|
parent::__set($name, $value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2020-08-31 01:27:08 +08:00
|
|
|
/**
|
|
|
|
|
* @param $name
|
|
|
|
|
* @return mixed
|
|
|
|
|
* @throws Exception
|
|
|
|
|
*/
|
2020-12-17 14:09:14 +08:00
|
|
|
public function __get($name): mixed
|
2020-08-31 01:27:08 +08:00
|
|
|
{
|
2020-09-02 15:37:06 +08:00
|
|
|
if (property_exists($this, $name)) {
|
2020-08-31 01:27:08 +08:00
|
|
|
return $this->$name ?? null;
|
|
|
|
|
} else {
|
|
|
|
|
return parent::__get($name);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|