programing

PHP 특성 - 일반 상수 정의

goodsources 2023. 1. 3. 21:48
반응형

PHP 특성 - 일반 상수 정의

네임스페이스 내의 여러 클래스에서 사용할 수 있는 상수를 정의하는 가장 좋은 방법은 무엇입니까?너무 많은 상속을 피하려고 하기 때문에 기본 클래스를 확장하는 것은 이상적인 솔루션이 아니며 특성을 활용하여 좋은 솔루션을 찾는 데 어려움을 겪고 있습니다.이것은 PHP 5.4에서 가능한 것입니까, 아니면 다른 접근방식을 취해야 합니까?

다음과 같은 상황이 있습니다.

trait Base
{
    // Generic functions
}

class A 
{
    use Base;
}

class B 
{
    use Base;
}

문제는 PHP 특성에 상수를 정의할 수 없다는 것입니다.이상적으로는 다음과 같은 것을 원합니다.

trait Base
{
    const SOME_CONST = 'someconst';
    const SOME_OTHER_CONST = 'someotherconst';

    // Generic functions
}

그런 다음 특성을 적용하는 클래스를 통해 다음 항목에 액세스할 수 있습니다.

echo A::SOME_CONST;
echo B::SOME_OTHER_CONST;

하지만 특징의 한계 때문에 이것은 가능하지 않습니다.좋은 생각 있어요?

사용자 분류의 인터페이스 제안을 가장 문제가 적은 방법으로 사용하였습니다.API 계약보다는 상수를 저장하기 위해 인터페이스를 사용하는 것은 좋지 않은 냄새가 나기 때문에 특성 구현보다는 OO 디자인에 대한 문제일 수 있습니다.

interface Definition
{
    const SOME_CONST = 'someconst';
    const SOME_OTHER_CONST = 'someotherconst';
}

trait Base
{
    // Generic functions
}

class A implements Definition
{
    use Base;
}

class B implements Definition
{
    use Base;
}

그 때문에, 이하가 가능하게 됩니다.

A::SOME_CONST;
B::SOME_CONST;

정적 변수를 사용할 수도 있습니다.수업이나 특성 자체에서 사용할 수 있습니다. - 경찰 대신으로 괜찮습니다.

trait myTrait {
    static $someVarA = "my specific content";
    static $someVarB = "my second specific content";
}

class myCustomClass {
    use myTrait;

    public function hello()
    {
        return self::$someVarA;
    }
}

상수의 범위를 제한하기 위해 네임스페이스 내에서 상수를 정의할 수 있습니다.

namespace Test;

const Foo = 123;

// generic functions or classes

echo Foo;
echo namespace\Foo;

이 접근법의 단점은 자동 로딩은 적어도 5.4에서는 작동하지 않는다는 것입니다.이러한 방법은 일반적으로 이러한 상수를 정적 클래스로 감싸는 것입니다.

namespace Test;

class Bar
{
    const Foo = 123;
}

좋은 건 아니지만, 어쩌면...

trait Base
{
    public static function SOME_CONST()
    {
        return 'value1';
    }

    public static function SOME_OTHER_CONST()
    {
        return 'value2';
    }

    // generic functions
}

class A
{
    use Base;
}

class B
{
    use Base;
}

echo A::SOME_CONST();
echo B::SOME_OTHER_CONST();

PHP 8.1부터는 사용할 수 있습니다.readonly특징의 특성.

<?php
trait A
{
    public readonly int $variable;
    
    protected function initA(int $newValue){
        $this->variable = $newValue;
    }

    public function changeVariable(int $newValue){
        $this->variable = $newValue;
    }
}

class B {
    use A;

    public function __construct() {
        $this->initA(1);
    }
}

$b = new B();
$b->changeVariable(5); // should faild: Fatal error: Uncaught Error: Cannot modify readonly property B::$variable

PHP 8.2의 특성에는 다음과 같은 상수가 있습니다.

trait Foo {
    public const FLAG_1 = 1;
    protected const FLAG_2 = 2;
    private const FLAG_3 = 2;
 
    public function doFoo(int $flags): void {
        if ($flags & self::FLAG_1) {
            echo 'Got flag 1';
        }
        if ($flags & self::FLAG_2) {
            echo 'Got flag 2';
        }
        if ($flags & self::FLAG_3) {
            echo 'Got flag 3';
        }
    }
}

다른 고려사항은 추상 클래스를 대신 사용한 후 상속할 수 있는지 여부입니다.

abstract class Base
{
    const A = 1;
    const B = 2;
}

class Class1 extends Base {}
class Class2 extends Base {}

echo Class1::A;
echo Class2::B;

물론, 특징의 이유 중 일부는 복잡한 유전 나무를 구성으로 대체하기 때문입니다.상황에 따라 다르죠

언급URL : https://stackoverflow.com/questions/24357985/php-traits-defining-generic-constants

반응형