Files
kiri-core/System/Abstracts/Component.php
T

162 lines
2.8 KiB
PHP
Raw Normal View History

2020-08-31 01:27:08 +08:00
<?php
/**
* Created by PhpStorm.
* User: whwyy
* Date: 2018/3/30 0030
* Time: 14:28
*/
namespace Snowflake\Abstracts;
use Exception;
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
*/
private $_events = [];
/**
* @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
*/
public function hasEvent($name, $callback = null)
{
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)
{
2020-09-03 11:39:20 +08:00
$aEvents = Snowflake::app()->event;
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
* @return mixed
*/
public function off($name, $handler = NULL)
{
2020-09-03 11:39:20 +08:00
$aEvents = Snowflake::app()->event;
2020-08-31 01:27:08 +08:00
if (!isset($this->_events[$name])) {
2020-08-31 12:38:32 +08:00
return $aEvents->of($name, $handler);
2020-08-31 01:27:08 +08:00
}
if (empty($handler)) {
unset($this->_events[$name]);
2020-08-31 12:38:32 +08:00
return $aEvents->of($name, $handler);
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-08-31 12:38:32 +08:00
return $aEvents->of($name, $handler);
2020-08-31 01:27:08 +08:00
}
/**
*/
public function offAll()
{
$this->_events = [];
2020-09-03 11:39:20 +08:00
$aEvents = Snowflake::app()->event;
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
*/
public function __get($name)
{
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);
}
}
}