|  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Request #67310 Allow abstract private functions in traits
Submitted: 2014-05-20 11:41 UTC Modified: 2017-10-24 07:18 UTC
Avg. Score:3.5 ± 0.5
Reproduced:6 of 6 (100.0%)
Same Version:2 (33.3%)
Same OS:3 (50.0%)
From: chrisb at zedcore dot com Assigned:
Status: Open Package: Scripting Engine problem
PHP Version: 5.4.28 OS: Debian GNU/Linux "wheezy"
Private report: No CVE-ID: None
Have you experienced this issue?
Rate the importance of this bug to you:

 [2014-05-20 11:41 UTC] chrisb at zedcore dot com
When using traits, the trait and the class using the trait can both access private members of the class. The trait can also define abstract methods to enforce that the class using the trait implements them.

However, it's not (currently) possible to define an abstract private method; it throws a fatal error. I assume this check was add pre-traits, where it obviously didn't make sense to have abstract private methods since they could never be overridden, but traits change this – an abstract private method in a trait *can* be overridden by the class using the trait. Therefore I think that it would make sense for the this check to be changed so that traits can define methods as "abstract private".

The test script attached causes a fatal error. Replacing the trait's "MyPrivateMethod" with an empty non-abstract function makes it print out "Hello World" as expected.

Test script:
trait MyTrait
        abstract private function MyPrivateMethod();
        public function MyPublicMethod() {

class MyClass {
        use MyTrait;
        private function MyPrivateMethod() {
                echo "Hello World";

$o = new MyClass();


Add a Patch

Pull Requests

Add a Pull Request


AllCommentsChangesGit/SVN commitsRelated reports
 [2014-05-22 22:42 UTC]
Implemented as, but we'll need someone with Zend karma to merge it.
 [2014-06-06 12:53 UTC] kjarli at gmail dot com
I could be wrong.. But why would a trait have to tell a class what to implement? That's the job of interfaces. Traits are just to add generic functionality to support "multiple inheritance". Therefore I highly disagree with traits being able to mark _anything_ as abstract and should abstract traits not be possible in my opinion.
 [2014-06-09 16:31 UTC]
-Status: Open +Status: Assigned -Assigned To: +Assigned To: aharvey
 [2014-06-09 16:31 UTC]
I'm going to RFC this post-5.6.0.
 [2014-06-12 14:33 UTC] chrisb at zedcore dot com
Abstract methods in traits are useful in the case where you have generic functionality which needs a certain amount of information from the class it is being used by. Being able to add abstract methods to traits means you can define accessor methods to get that data. The "abstract trait members" example *in the PHP manual* is a perfect example of this.

It's not currently possible for a trait to enforce that the using class implements a particular interface, so I don't see how that's relevant.
 [2017-10-24 07:18 UTC]
-Status: Assigned +Status: Open -Assigned To: aharvey +Assigned To:
PHP Copyright © 2001-2018 The PHP Group
All rights reserved.
Last updated: Sun Nov 19 01:31:42 2017 UTC