skip to Main Content

I have in laravel inside the same App folder a class and a trait

MyClass.php

<?php

namespace App;

class MyClass {

    use myTrait;
    CONST MY_CONST = 'CONST';
    
    public function showConst() {
        echo $this->myTraitMethod();
    }
    
}

MyTrait.php

<?php

namespace App;

class MyTrait {
    
    public function myTraitMethod() {
        return self::MY_CONST; // Undefined class constant 'MY_CONST'
        return static::MY_CONST; // Undefined class constant 'MY_CONST'
        return MyClass:MY_CONST; // This is the only one that works but I'm forcing the class name
    
    }
}

the issue is that I cannot access MY_CONST except if I force the parent class name that is not a solution for me.

The issue is just with vscode, I mean the code runs fines with both self and static but vscode returns the error

Undefined class constant 'MY_CONST'

2

Answers


  1. Chosen as BEST ANSWER

    So after I understood that the issue was just in vscode, I found that is a know issue of Intelephense due the fact that in older php versions, constants could not be declared in php traits

    https://github.com/bmewburn/vscode-intelephense/issues/2024

    the solution is to suppress the message using /** @disregard P1012 */ on top like this

    MyTrait.php

    <?php
    
    namespace App;
    
    class MyTrait {
        
        public function myTraitMethod() {
            /** @disregard P1012 */
            return self::MY_CONST;
        }
    }
    

  2. In PHP, traits serve as reusable blocks of code that can be included in multiple classes. This approach allows developers to share methods across various classes without the limitations of inheritance, which only supports a single parent class. However, there is a drawback: traits cannot directly reference constants defined within the classes that incorporate them. This limitation exists because constants are specific to each class and are not inherently visible to the trait itself.

    In your original setup:

    You have a class named MyClass that defines a constant MY_CONST.

    You want to use this constant inside a trait named MyTrait.

    However, accessing MY_CONST directly from the trait results in an error unless the class name is hardcoded, which is restrictive and reduces the flexibility of the trait.

    Solution Approach
    To address this issue, we can introduce an abstract method in the trait. An abstract method contains no implementation but compels any class using the trait to define it. By doing so, we create a way for the class to pass the constant’s value to the trait, without the trait requiring direct access to the constant itself.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search