1. Go to this page and download the library: Download affinity4/magic library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
affinity4 / magic example snippets
composer
class User extends Model
{
public function register(string $username, string $email, string $password)
{
// ...save data to `users` table
echo "New user saved to `users` table\n";
}
}
use Affinity4\Magic\Magic;
class User extends Model
{
use Magic;
/**
* @var array
*/
public $onRegistration = [];
public function register(string $username, string $email, string $password)
{
echo "New user saved to `users` table";
$this->onRegistration($username, $email, $password);
}
}
use Affinity4\Magic\Magic;
class Model {}
class User extends Model
{
use Magic;
/**
* @var array
*/
public $onRegistration = [];
public function register(string $username, string $email, string $password)
{
echo "New user saved to `users` table\n";
$this->onRegistration($username, $email, $password);
}
}
$User = new User;
$User->onRegistration[] = function($username, $email, $password)
{
echo "Send email to $email\n";
echo "Hi $username!";
echo "Thank you for signing up! Your password is '$password'";
};
$User->register('johndoe', '[email protected]', 'whoami');
// echos:
// New user saved to `users` table
// Send email to [email protected]
// Hi johndoe!
// Thank you for signing up!. Your password is 'whoami'
use Affinity4\Magic\Magic;
use Some\Library\Log;
class Email
{
use Magic;
public $onEmail;
public function send($to, $from, $body)
{
// Email stuff...
$this->onEmail($to, $from, $body);
}
}
$EmailA = new Email;
$EmailA->onEmail[] = function($to, $from, $body) {
Log::info("Email sent to $to from $from that said $body");
};
$EmailB = new Email;
$EmailB->send('[email protected]', '[email protected]', 'Check this out!');
use Affinity4\Magic\Magic;
use Pimple\Container;
class Email
{
use Magic;
public $onEmail = [];
public function send($to)
{
echo "Emailed $to\n";
$this->onEmail($to);
}
}
class User
{
use Magic;
public $onSave = [];
public function save($id)
{
echo "Saved $id\n";
$this->onSave($id);
}
}
$Container = new Container();
$Container[User::class] = $Container->factory(function($c) {
$User = new User;
$User->onSave[] = function($id) use ($c) {
echo "EVENT: Saved $id\n";
$c[Email::class]->send('email');
};
return $User;
});
$Container[Email::class] = $Container->factory(function($c) {
$Email = new Email;
$Email->onEmail[] = function($to) {
echo "EVENT: Emailed $to";
};
return $Email;
});
$Container[User::class]->onSave[] = function($id) use ($Container) {
echo "EVENT: Saved $id\n";
$Container[Email::class]->send('email');
};
$Container[User::class]->save(1);
// Will echo:
// Saved 1
// EVENT: Saved 1
// Emailed email
// EVENT: Emailed email
use Affinity4\Magic\Magic;
class User
{
// User model
}
class UserAccount
{
use Magic;
private $User;
public $reputation = 0;
public $level = 0;
public $onReputationChange = [];
public $onLevelUp = [];
public function __construct(\User $User)
{
$this->User = $User;
}
public function setReputation(int $reputation)
{
$current_reputation = $this->reputation;
// We want acces to the user model also in our event listeners
$this->onReputationChange($current_reputation, $reputation, $this->User);
$this->reputation = $reputation;
}
public function getReputation(): int
{
return $this->reputation;
}
public function setLevel(int $level)
{
$current_level = $this->level;
if ($current_level < $level) {
$this->onLevelUp($level, $this->User);
}
$this->level = $level;
}
public function getLevel(): int
{
return $this->level;
}
}
$User = new User;
$UserAccount = new UserAccount($User);
$UserAccount->onReputationChange[] = function(int $current_reputation, int $new_reputation, \User $User) use ($UserAccount)
{
// Chweck this was a reputation increase and by 10 points or more
if ($current_reputation < $new_reputation && $new_reputation >= 10) {
echo "Reputation increased to $new_reputation\n";
// Make sure to use the same instance of $UserAccount
$UserAccount->setLevel(1); // Level up to Level 1
}
};
$UserAccount->onLevelUp[] = function(int $new_level) {
echo "You have leveled up! You're now on Level $new_level!\n";
};
$UserAccount->setReputation(10);
// echos...
// Reputation increased to 10
// You have leveled up! You're now on Level 1!
/**
* @property int $reputation
* @property int $level
*/
class UserAccount
{
use Magic;
private $User;
private $reputation = 0; // Change to private
private $level = 0; // Change to private
// ...the rest is uncahnged!
$UserAccount->reputation = 10;
Reputation increased to 10
You have leveled up! You're now on Level 1!
use Affinity4\Magic\Magic;
/**
* @property int $number_of_highlanders
* @property int $lifeforce
*/
class Highlander
{
use Magic;
/**
* @var int
*/
private $number_of_highlanders= 3;
/**
* @var int
*/
private $lifeforce = 10;
public function setNumberOfHighlanders(int $number_of_highlanders)
{
$this->number_of_highlanders= $number_of_highlanders;
}
public function getNumberOfHighlanders(): int
{
return $this->number_of_highlanders;
}
public function setLifeforce(int $lifeforce)
{
$this->lifeforce = $lifeforce;
}
public function getLifeforce()
{
return $this->lifeforce;
}
public function shout(string $phrase)
{
echo $phrase;
}
}
use Affinity4\Magic\Magic;
/**
* @property int $lifeforce
* @property int $number_of_highlanders
*/
class Highlander
{
use Magic;
private $lifeforce = 10;
private $number_of_highlanders= 4;
public $onKill = [];
public function setLifeforce(int $lifeforce)
{
$this->lifeforce = $lifeforce;
}
public function getLifeforce(): int
{
return $this->lifeforce;
}
public function setNumberOfHighlanders(int $number_of_highlanders)
{
$this->number_of_highlanders= $number_of_highlanders;
}
public function getNumberOfHighlanders(): int
{
return $this->number_of_highlanders;
}
public function shout(string $phrase)
{
echo $phrase;
}
public function kill(\Highlander $Opponent)
{
$this->onKill($Opponent);
}
}
$Highlander = new Highlander;
$Opponent = new Highlander;
// He killed someone along the way here. But so far only
// he's aware there are only 3 Highlanders left, our player still thinks there are 4
--$Opponent->number_of_highlanders;
$Highlander->onKill[] = function($Opponent) use ($Highlander) {
$Highlander->lifeforce += $Opponent->getLifeforce();
if ($Opponent->number_of_highlanders< $Highlander->number_of_highlanders) {
$Highlander->number_of_highlanders= ($Opponent->number_of_highlanders- 1);
}
echo "You lifeforce is {$Highlander->lifeforce}!\n";
echo "There are {$Highlander->number_of_highlanders} highlanders left\n";
if ($Highlander->number_of_highlanders> 1) {
$Highlander->shout("There can be only one!!!\n");
}
};
$Highlander->kill($Opponent);
// echoes...
// There are only 2 Highlanders left
// You now have 20 lifeforce!
// There can be only one!!
$Highlander = new Highlander;
$Opponent = new Highlander;
// He killed someone along the way here. But so far only
// he's aware there are only 3 Highlanders left, our player still thinks there are 4
--$Opponent->number_of_highlanders;
$Highlander->onKill[] = function($Opponent) use ($Highlander) {
$Highlander->lifeforce += $Opponent->getLifeforce();
if ($Opponent->number_of_highlanders< $Highlander->number_of_highlanders) {
$Highlander->number_of_highlanders= ($Opponent->number_of_highlanders- 1);
}
echo "You lifeforce is {$Highlander->lifeforce}!\n";
echo "There are {$Highlander->number_of_highlanders} highlanders left\n";
if ($Highlander->number_of_highlanders> 1) {
$Highlander->shout("There can be only one!!!\n");
}
};
$Highlander->kill($Opponent);
$Highlander->onKill[] = function($Opponent) use ($Highlander) {
$Highlander->lifeforce += $Opponent->getLifeforce();
echo "You lifeforce is {$Highlander->lifeforce}!\n";
if ($Opponent->number_of_highlanders< $Highlander->number_of_highlanders) {
$Highlander->number_of_highlanders= ($Opponent->number_of_highlanders - 1);
}
echo "There are {$Highlander->number_of_highlanders} highlanders left\n";
if ($Highlander->number_of_highlanders> 1) {
$Highlander->shout("There can be only one!!!\n");
}
class TakeOpponentsLifeforceEventHandler
{
private $Highlander;
public function __construct(\Highlander $Highlander)
{
$this->Highlander = $Highlander;
}
public function __invoke(\Highlander $Opponent)
{
$this->Highlander->lifeforce += $Opponent->getLifeforce();
echo "You're lifeforce is now {$this->Highlander->lifeforce}!\n";
}
}
class UpdateNumberOfHighlandersEventHandler
{
private $Highlander;
public function __construct(\Highlander $Highlander)
{
$this->Highlander = $Highlander;
}
private function decrementNumberOfHighlanders(\Highlander $Opponent)
{
if ($Opponent->number_Of_highlanders < $this->Highlander->number_Of_highlanders) {
$this->Highlander->number_Of_highlanders = (--$Opponent->number_Of_highlanders);
}
}
public function __invoke(\Highlander $Opponent)
{
$this->decrementNumberOfHighlanders($Opponent);
echo "There are {$this->Highlander->number_Of_highlanders} highlanders left\n";
if ($this->Highlander->number_Of_highlanders > 1) {
$this->Highlander->shout("There can be only one!!!\n");
}
}
}
$Highlander = new Highlander;
$Opponent = new Highlander;
// He killed someone along the way here. But so far only
// he's aware there are only 3 Highlanders left, our player still thinks there are 4
--$Opponent->number_of_highlanders;
$Highlander->onKill[] = new TakeOpponentsLifeforceEventHandler($Highlander);
$Highlander->onKill[] = new UpdateNumberOfHighlandersEventHandler($Highlander);
$Highlander->kill($Opponent);
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.