Вход Регистрация
Файл: vendor/intervention/image/src/Traits/CanBeDriverSpecialized.php
Строк: 96
<?php

declare(strict_types=1);

namespace 
InterventionImageTraits;

use 
InterventionImageExceptionsNotSupportedException;
use 
InterventionImageExceptionsStateException;
use 
InterventionImageInterfacesDriverInterface;
use 
InterventionImageInterfacesSpecializableInterface;
use 
ReflectionClass;

trait 
CanBeDriverSpecialized
{
    
/**
     * Cache for constructor parameter names keyed by class name.
     *
     * @var array<string, array<int, string>>
     */
    
private static array $parameterCache = [];

    
/**
     * The driver with which the instance will be specialized.
     */
    
protected DriverInterface $driver;

    
/**
     * {@inheritdoc}
     *
     * @see SpecializableInterface::specializationArguments()
     */
    
public function specializationArguments(): array
    {
        
$class $this::class;

        if (!isset(
self::$parameterCache[$class])) {
            
$names = [];
            
$reflectionClass = new ReflectionClass($class);
            
$constructor $reflectionClass->getConstructor();
            if (
$constructor !== null) {
                foreach (
$constructor->getParameters() as $parameter) {
                    
$names[] = $parameter->getName();
                }
            }
            
self::$parameterCache[$class] = $names;
        }

        
$specializable = [];
        foreach (
self::$parameterCache[$class] as $name) {
            
$specializable[$name] = $this->{$name};
        }

        return 
$specializable;
    }

    
/**
     * {@inheritdoc}
     *
     * @see SpecializableInterface::driver()
     *
     * @throws StateException
     */
    
public function driver(): DriverInterface
    
{
        if (!isset(
$this->driver)) {
            throw new 
StateException(
                
'Use setDriver() on ' $this::class . ' to provide an applicable ' DriverInterface::class,
            );
        }

        return 
$this->driver;
    }

    
/**
     * {@inheritdoc}
     *
     * @see SpecializableInterface::setDriver()
     *
     * @throws NotSupportedException
     */
    
public function setDriver(DriverInterface $driver): SpecializableInterface
    
{
        if (!
$this->belongsToDriver($driver)) {
            throw new 
NotSupportedException(
                
"Class '" $this::class . "' can not be used with " $driver->id() . " driver",
            );
        }

        
$this->driver $driver;

        return 
$this;
    }

    
/**
     * Determine if the current object belongs to the given driver's namespace.
     */
    
protected function belongsToDriver(object $driver): bool
    
{
        return 
str_starts_with(
            
$this::class,
            
substr($driver::class, 0, (int) strrpos($driver::class, '\')), // driver namespace
        );
    }
}
Онлайн: 1
Реклама