132 lines
2.6 KiB
PHP
132 lines
2.6 KiB
PHP
|
<?php
|
||
|
|
||
|
namespace Illuminate\Support;
|
||
|
|
||
|
use ArrayAccess;
|
||
|
use ArrayObject;
|
||
|
use Illuminate\Support\Traits\Macroable;
|
||
|
|
||
|
class Optional implements ArrayAccess
|
||
|
{
|
||
|
use Macroable {
|
||
|
__call as macroCall;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* The underlying object.
|
||
|
*
|
||
|
* @var mixed
|
||
|
*/
|
||
|
protected $value;
|
||
|
|
||
|
/**
|
||
|
* Create a new optional instance.
|
||
|
*
|
||
|
* @param mixed $value
|
||
|
* @return void
|
||
|
*/
|
||
|
public function __construct($value)
|
||
|
{
|
||
|
$this->value = $value;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Dynamically access a property on the underlying object.
|
||
|
*
|
||
|
* @param string $key
|
||
|
* @return mixed
|
||
|
*/
|
||
|
public function __get($key)
|
||
|
{
|
||
|
if (is_object($this->value)) {
|
||
|
return $this->value->{$key} ?? null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Dynamically check a property exists on the underlying object.
|
||
|
*
|
||
|
* @param mixed $name
|
||
|
* @return bool
|
||
|
*/
|
||
|
public function __isset($name)
|
||
|
{
|
||
|
if (is_object($this->value)) {
|
||
|
return isset($this->value->{$name});
|
||
|
}
|
||
|
|
||
|
if (is_array($this->value) || $this->value instanceof ArrayObject) {
|
||
|
return isset($this->value[$name]);
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Determine if an item exists at an offset.
|
||
|
*
|
||
|
* @param mixed $key
|
||
|
* @return bool
|
||
|
*/
|
||
|
public function offsetExists($key): bool
|
||
|
{
|
||
|
return Arr::accessible($this->value) && Arr::exists($this->value, $key);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get an item at a given offset.
|
||
|
*
|
||
|
* @param mixed $key
|
||
|
* @return mixed
|
||
|
*/
|
||
|
public function offsetGet($key): mixed
|
||
|
{
|
||
|
return Arr::get($this->value, $key);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the item at a given offset.
|
||
|
*
|
||
|
* @param mixed $key
|
||
|
* @param mixed $value
|
||
|
* @return void
|
||
|
*/
|
||
|
public function offsetSet($key, $value): void
|
||
|
{
|
||
|
if (Arr::accessible($this->value)) {
|
||
|
$this->value[$key] = $value;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Unset the item at a given offset.
|
||
|
*
|
||
|
* @param string $key
|
||
|
* @return void
|
||
|
*/
|
||
|
public function offsetUnset($key): void
|
||
|
{
|
||
|
if (Arr::accessible($this->value)) {
|
||
|
unset($this->value[$key]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Dynamically pass a method to the underlying object.
|
||
|
*
|
||
|
* @param string $method
|
||
|
* @param array $parameters
|
||
|
* @return mixed
|
||
|
*/
|
||
|
public function __call($method, $parameters)
|
||
|
{
|
||
|
if (static::hasMacro($method)) {
|
||
|
return $this->macroCall($method, $parameters);
|
||
|
}
|
||
|
|
||
|
if (is_object($this->value)) {
|
||
|
return $this->value->{$method}(...$parameters);
|
||
|
}
|
||
|
}
|
||
|
}
|