A trait to dynamically add methods to a class
, (*1)
This package provides a trait that, when applied to a class, makes it possible to add methods to that class at runtime., (*2)
Here's a quick example:, (*3)
$myClass = new class() {
use Spatie\Macroable\Macroable;
};
$myClass::macro('concatenate', function(... $strings) {
return implode('-', $strings);
};
$myClass->concatenate('one', 'two', 'three'); // returns 'one-two-three'
The idea of a macroable trait and the implementation is taken from the macroable
trait of the the Laravel framework., (*4)
Installation
You can install the package via composer:, (*5)
composer require hoangphison/macroable
Usage
You can add a new method to a class using macro
:, (*6)
$macroableClass = new class() {
use Spatie\Macroable\Macroable;
};
$macroableClass::macro('concatenate', function(... $strings) {
return implode('-', $strings);
};
$myClass->concatenate('one', 'two', 'three'); // returns 'one-two-three'
Callables passed to the macro
function will be bound to the class
, (*7)
$macroableClass = new class() {
protected $name = 'myName';
use Spatie\Macroable\Macroable;
};
$macroableClass::macro('getName', function() {
return $this->name;
};
$macroableClass->getName(); // returns 'myName'
You can also add multiple methods in one go my using a mixin class. A mixin class contains methods that return callables. Each method from the mixin will be registered on the macroable class., (*8)
$mixin = new class() {
public function mixinMethod()
{
return function() {
return 'mixinMethod';
};
}
public function anotherMixinMethod()
{
return function() {
return 'anotherMixinMethod';
};
}
};
$macroableClass->mixin($mixin);
$macroableClass->mixinMethod() // returns 'mixinMethod';
$macroableClass->anotherMixinMethod() // returns 'anotherMixinMethod';
Changelog
Please see CHANGELOG for more information what has changed recently., (*9)
Testing
bash
composer test
, (*10)
Contributing
Please see CONTRIBUTING for details., (*11)
Security
If you discover any security related issues, please email freek@spatie.be instead of using the issue tracker., (*12)
Postcardware
You're free to use this package (it's MIT-licensed), but if it makes it to your production environment we highly appreciate you sending us a postcard from your hometown, mentioning which of our package(s) you are using., (*13)
Our address is: Spatie, Samberstraat 69D, 2060 Antwerp, Belgium., (*14)
We publish all received postcards on our company website., (*15)
Credits
Idea and code is taken from the macroable
trait of the the Laravel framework., (*16)
Support us
Spatie is a webdesign agency based in Antwerp, Belgium. You'll find an overview of all our open source projects on our website., (*17)
Does your business depend on our contributions? Reach out and support us on Patreon.
All pledges will be dedicated to allocating workforce on maintenance and new awesome stuff., (*18)
License
The MIT License (MIT). Please see License File for more information., (*19)