3v4l.org

run code in 300+ PHP versions simultaneously
<?php namespace Traverse\Test { interface MyTypeInterface { function getPropertyA(); function getPropertyB(); } class MyType implements MyTypeInterface { private $_propertyA; private $_propertyB; final public function getPropertyA() { return $this->_propertyA; } final public function getPropertyB() { return $this->_propertyB; } final private function setPropertyA($propertyA) { // $propertyA assertions $this->_propertyA = $propertyA; } final private function setPropertyB($propertyB) { // $propertyB assertions $this->_propertyB = $propertyB; } public function __construct(MyTypeInterface $myType) { $this->setPropertyA($myType->getPropertyA()); $this->setPropertyB($myType->getPropertyB()); } } class MyTypeBuilder implements MyTypeInterface { private $_propertyA; private $_propertyB; public function getPropertyA() { return $this->_propertyA; } public function setPropertyA($propertyA) { $this->_propertyA = $propertyA; } public function getPropertyB() { return $this->_propertyB; } public function setPropertyB($propertyB) { $this->_propertyB = $propertyB; } } $myTypeBuilder = new MyTypeBuilder(); $myTypeBuilder->setPropertyA('foo'); $myTypeBuilder->setPropertyB('bar'); $myType = new MyType($myTypeBuilder); var_dump($myTypeBuilder, $myType); /* object(Traverse\Test\MyTypeBuilder)#1 (2) { ["_propertyA":"Traverse\Test\MyTypeBuilder":private]=> string(3) "foo" ["_propertyB":"Traverse\Test\MyTypeBuilder":private]=> string(3) "bar" } object(Traverse\Test\MyType)#2 (2) { ["_propertyA":"Traverse\Test\MyType":private]=> string(3) "foo" ["_propertyB":"Traverse\Test\MyType":private]=> string(3) "bar" } */ }
Output for 8.0.0 - 8.0.30, 8.1.0 - 8.1.27, 8.2.0 - 8.2.17, 8.3.0 - 8.3.4
Warning: Private methods cannot be final as they are never overridden by other classes in /in/Qe8d7 on line 26 Warning: Private methods cannot be final as they are never overridden by other classes in /in/Qe8d7 on line 31 object(Traverse\Test\MyTypeBuilder)#1 (2) { ["_propertyA":"Traverse\Test\MyTypeBuilder":private]=> string(3) "foo" ["_propertyB":"Traverse\Test\MyTypeBuilder":private]=> string(3) "bar" } object(Traverse\Test\MyType)#2 (2) { ["_propertyA":"Traverse\Test\MyType":private]=> string(3) "foo" ["_propertyB":"Traverse\Test\MyType":private]=> string(3) "bar" }
Output for 5.3.0 - 5.3.29, 5.4.0 - 5.4.45, 5.5.24 - 5.5.35, 5.6.8 - 5.6.28, 7.0.0 - 7.0.20, 7.1.0 - 7.1.33, 7.2.0 - 7.2.33, 7.3.0 - 7.3.33, 7.4.0 - 7.4.33
object(Traverse\Test\MyTypeBuilder)#1 (2) { ["_propertyA":"Traverse\Test\MyTypeBuilder":private]=> string(3) "foo" ["_propertyB":"Traverse\Test\MyTypeBuilder":private]=> string(3) "bar" } object(Traverse\Test\MyType)#2 (2) { ["_propertyA":"Traverse\Test\MyType":private]=> string(3) "foo" ["_propertyB":"Traverse\Test\MyType":private]=> string(3) "bar" }
Output for 4.4.2 - 4.4.9, 5.1.0 - 5.1.6, 5.2.0 - 5.2.17
Parse error: syntax error, unexpected T_STRING in /in/Qe8d7 on line 3
Process exited with code 255.
Output for 4.3.0 - 4.3.1, 4.3.5 - 4.3.11, 4.4.0 - 4.4.1, 5.0.0 - 5.0.5
Parse error: parse error, unexpected T_STRING in /in/Qe8d7 on line 3
Process exited with code 255.
Output for 4.3.2 - 4.3.4
Parse error: parse error in /in/Qe8d7 on line 3
Process exited with code 255.

preferences:
225.2 ms | 401 KiB | 355 Q