code-distortion / insight
Test protected and private object methods and properties as if they were public
Requires
- php: 7.0.* | 7.1.* | 7.2.* | 7.3.* | 7.4.* | 8.0.* | 8.1.* | 8.2.* | 8.3.*
Requires (Dev)
- infection/infection: ^0.10 | ^0.11 | ^0.12 | ^0.13 | ^0.14 | ^0.15 | ^0.16 | ^0.17 | ^0.18 | ^0.19 | ^0.20 | ^0.21 | ^0.22 | ^0.23 | ^0.24 | ^0.25 | ^0.26 | ^0.27
- jchook/phpunit-assert-throws: ^1.0
- phpstan/phpstan: ^0.9 | ^0.10 | ^0.11 | ^0.12 | ^1.0
- phpunit/phpunit: ~4.8 | ^5.0 | ^6.0 | ^7.0 | ^8.4 | ^9.0 | ^10.0
- squizlabs/php_codesniffer: ^3.8.0
README
code-distortion/insight is a PHP library that allows you to access protected and private object methods and properties, as if they were public.
$myObject->privateMethod(); // "Error: Call to private method ..." $testObject = new Insight($myObject); $testObject->privateMethod(); // success
This might be useful when testing. It might be a good idea, or it might not. It's up to you.
Note: Using Insight for purposes other than testing is probably a code smell.
Installation
Install the package via composer:
composer require code-distortion/insight --dev
Usage
Instantiate an Insight object:
// build based on an existing object $myObject = new MyClass(); $testObject = new Insight($myObject); // or $testObject = new Insight(new MyClass());
$testObject
will then act as if it is the original object, but gives you access to its protected and private methods and properties as well.
Read and write protected and private properties:
$testObject->publicProp = 'something'; $testObject->protectedProp = 'something'; $testObject->privateProp = 'something'; print $testObject->publicProp; print $testObject->protectedProp; print $testObject->privateProp;
Call protected and private methods:
print $testObject->publicMethod(); print $testObject->protectedMethod(); print $testObject->privateMethod();
These can be useful while testing your code with phpunit:
$this->testSame('someValue', $testObject->privateProperty); $this->testSame('someValue', $testObject->privateMethod());
Abstract classes
You can test abstract classes (and classes whose constructor is not public) by passing the class when instantiating an Insight object.
$testObject = new Insight(MyClass::class);
Note: When instantiating Insight with a class like this (instead of an object) you will only be able to access it's static methods and properties.
Note: To test other functionality of an abstract class you will need to have a concrete class that extends the abstract class, and use that instead.
Static methods and properties
PHP doesn't have __getStatic()
or __setStatic()
magic methods either which would help facilitate accessing protected properties.
Instead, Insight lets you access static methods and properties in the same way as regular methods and properties. Just add StaticProp
or StaticMethod
after the property or method name respectively:
// calling them from an Insight object $testObject = new Insight(new MyClass()); // or $testObject = new Insight(MyClass::class); $testObject->privateStaticProp = 'something'; $testObject->privateStaticMethod(); // this syntax is also available allowing you to access them in one line Insight::{myClass::class}()->privateStaticProp = 'something'; Insight::{myClass::class}()->privateStaticMethod();
Misc
You can access the underlying object or class by accessing the ->insight
property:
// when instantiated using an object $myObject = new MyClass(); $testObject = new Insight($myObject); $testObject->insight; // === $myObject // when instantiated using a class name $testObject = new Insight(MyClass::class); $testObject->insight; // === 'Namespace\To\MyClass'
Testing This Package
- Clone this package:
git clone https://github.com/code-distortion/insight.git .
- Run
composer install
to install dependencies - Run the tests:
composer test
Changelog
Please see CHANGELOG for more information on what has changed recently.
SemVer
This library uses SemVer 2.0.0 versioning. This means that changes to X
indicate a breaking change: 0.0.X
, 0.X.y
, X.y.z
. When this library changes to version 1.0.0, 2.0.0 and so forth, it doesn't indicate that it's necessarily a notable release, it simply indicates that the changes were breaking.
Treeware
This package is Treeware. If you use it in production, then we ask that you buy the world a tree to thank us for our work. By contributing to the Treeware forest you’ll be creating employment for local families and restoring wildlife habitats.
Contributing
Please see CONTRIBUTING for details.
Code of Conduct
Please see CODE_OF_CONDUCT for details.
Security
If you discover any security related issues, please email tim@code-distortion.net instead of using the issue tracker.
Credits
License
The MIT License (MIT). Please see License File for more information.