Type hinting for properties in PHP 7?

前端 未结 4 1699
庸人自扰
庸人自扰 2020-12-10 10:15

Does php 7 support type hinting for class properties?

I mean, not just for setters/getters but for the property itself.

Something like:

         


        
4条回答
  •  暖寄归人
    2020-12-10 10:31

    7.4+:

    Good news that it will be implemented in the new releases, as @Andrea pointed out. I will just leave this solution here in case someone wants to use it prior to 7.4


    7.3 or less

    Based on the notifications I still receive from this thread, I believe that many people out there had/is having the same issue that I had. My solution for this case was combining setters + __set magic method inside a trait in order to simulate this behaviour. Here it is:

    trait SettersTrait
    {
        /**
         * @param $name
         * @param $value
         */
        public function __set($name, $value)
        {
            $setter = 'set'.$name;
            if (method_exists($this, $setter)) {
                $this->$setter($value);
            } else {
                $this->$name = $value;
            }
        }
    }
    

    And here is the demonstration:

    class Bar {}
    class NotBar {}
    
    class Foo
    {
        use SettersTrait; //It could be implemented within this class but I used it as a trait for more flexibility
    
        /**
         *
         * @var Bar
         */
        private $bar;
    
        /**
         * @param Bar $bar
         */
        protected function setBar(Bar $bar)
        {
            //(optional) Protected so it wont be called directly by external 'entities'
            $this->bar = $bar;
        }
    }
    
    $foo = new Foo();
    $foo->bar = new NotBar(); //Error
    //$foo->bar = new Bar(); //Success
    

    Explanation

    First of all, define bar as a private property so PHP will cast __set automagically.

    __set will check if there is some setter declared in the current object (method_exists($this, $setter)). Otherwise it will only set its value as it normally would.

    Declare a setter method (setBar) that receives a type-hinted argument (setBar(Bar $bar)).

    As long as PHP detects that something that is not Bar instance is being passed to the setter, it will automaticaly trigger a Fatal Error: Uncaught TypeError: Argument 1 passed to Foo::setBar() must be an instance of Bar, instance of NotBar given

提交回复
热议问题