<?php
trait EvilTrait
{
/**
* @var int
*/
public $foobarCalls = 0;
/**
* final AND protected, even if you override it, you shouldn't be allowed to make it private, right?
* @return string
*/
final protected function getSomeString()
{
return 'This was returned by a protected method called getSomeString';
}
/**
* Abstracts are useful to ensure certain methods exist, and have a particular signature
*/
abstract protected function someAbstractMethod();
/**
* Be careful with method names like this, if the using class has the same name, it might become
* an old-school constructor... Oh, did you know that PHP4-style constructors emit E_DEPRECATED notices?
*/
public function foobar()
{
$this->foobarCalls++;
}
}
class Foobar
{
//using an alias AND changing visibility, hmmm... that may not be a good idea
use EvilTrait { getSomeString as public iSeeYou; }
/**
* Abstract declares this method as protected, so only protected and public
* should be allowed, this is private, I'd expect a fatal error here:
*/
private function someAbstractMethod()
{
return 'This should not be allowed';
}
/**
* We've implemented an abstract method in an illegal fashion
* Let's check if we can call this contract-breaking implementation:
*/
public function testAbstractImplementation()
{
return $this->someAbstractMethod();
}
/**
* Note: using as <alias> doesn't mean the original method-name is forgotten
* It only means that you can call it by a different name, AND that its visibility
* depends on the alias... $x->getSomeString() doesn't work
*/
public function demonstrateAlias()
{
return $this->getSomeString();
}
}
$x = new Foobar();
var_dump($x->foobarCalls);
echo $x->testAbstractImplementation(), PHP_EOL,
$x->iSeeYou(), PHP_EOL,
$x->demonstrateAlias();