2017 © Pedro PelĆ”ez
 

library visitor

Visitor library

image

cubiche/visitor

Visitor library

  • Thursday, March 16, 2017
  • by osorioramirez
  • Repository
  • 2 Watchers
  • 1 Stars
  • 798 Installations
  • PHP
  • 5 Dependents
  • 0 Suggesters
  • 0 Forks
  • 0 Open issues
  • 18 Versions
  • 0 % Grown

The README.md

Cubiche/Visitor

Build Status Coverage Status Scrutinizer Code Quality, (*1)

A visitor pattern implementation in PHP, using a Dynamic dispatch mechanism., (*2)

Installation

Via Composer, (*3)

$ composer require cubiche/visitor:dev-master

Basic usage

Arithmetic expressions calculator, (*4)


use Cubiche\Core\Visitor\Visitee; use Cubiche\Core\Visitor\Visitor; abstract class Expression extends Visitee {} abstract class Operator extends Expression { protected $operator; protected $firstOperand; protected $secondOperand; public function __construct($operator, Expression $firstOperand, Expression $secondOperand) { $this->operator = $operator; $this->firstOperand = $firstOperand; $this->secondOperand = $secondOperand; } public function operator() { return $this->operator; } public function firstOperand() { return $this->firstOperand; } public function secondOperand() { return $this->secondOperand; } } class Sum extends Operator { public function __construct(Expression $firstOperand, Expression $secondOperand) { parent::__construct('+', $firstOperand, $secondOperand); } } class Mult extends Operator { public function __construct(Expression $firstOperand, Expression $secondOperand) { parent::__construct('*', $firstOperand, $secondOperand); } } class Value extends Expression { protected $value; public function __construct($value) { $this->value = $value; } public function value() { return $this->value; } } class Variable extends Expression { protected $name; public function __construct($name) { $this->name = $name; } public function name() { return $this->name; } } class Calculator extends Visitor { public function visitSum(Sum $sum) { return $sum->firstOperand()->accept($this) + $sum->secondOperand()->accept($this); } public function visitMult(Mult $mult) { return $mult->firstOperand()->accept($this) * $mult->secondOperand()->accept($this); } public function visitValue(Value $value) { return $value->value(); } } $expression = new Sum( new Value(5), new Mult( new Value(3), new Value(2) ) ); $calculator = new Calculator(); $result = $expression->accept($calculator);

Visit parent class

use Cubiche\Core\Visitor\Visitor;

class ExpressionToStringConverter extends Visitor
{
    public function visitOperator(Operator $op)
    {
        return '('.$op->firstOperand()->accept($this).$op->operator().$op->secondOperand()->accept($this).')';
    }

    public function visitValue(Value $value)
    {
        return (string) $value->value();
    }

    public function visitVariable(Variable $variable)
    {
        return $variable->name();
    }
}

$expression = new Sum(
    new Value(5),
    new Mult(
        new Value(3),
        new Value(2)
    )
);

$converter = new ExpressionToStringConverter();
echo $expression->accept($converter);

Note that the visitOperator method is invoked when an operator(Sum or Mult) is visited., (*5)

Passing parameters to visit methods

class SmartExpressionToStringConverter extends ExpressionToStringConverter
{
    public function visitOperator(Operator $op, $parentOperator = null)
    {
        $currentOperator = $op->operator();
        $expression = $op->firstOperand()->accept($this, $currentOperator).
            $currentOperator.$op->secondOperand()->accept($this, $currentOperator);

        return $this->requireParentheses($currentOperator, $parentOperator) ? '('.$expression.')' : $expression;
    }

    protected function requireParentheses($currentOperator, $parentOperator)
    {
        return $currentOperator === '+' && $parentOperator === '*';
    }
}
$expression = new Sum(
    new Value(5),
    new Mult(
        new Value(3),
        new Value(2)
    )
);

$converter = new SmartExpressionToStringConverter();
echo $expression->accept($converter);

Extending another visitor without inheritance

use Cubiche\Core\Visitor\LinkedVisitor;

class Evaluator extends LinkedVisitor
{
    protected $variables;

    public function __construct(Calculator $calculator, $variables = array())
    {
        parent::__construct($calculator);
        $this->variables = $variables;
    }

    public function visitVariable(Variable $variable)
    {
        if (isset($this->variables[$variable->name()])) {
            return $this->variables[$variable->name()];
        }
        throw new \Exception(\sprintf("Unknown variable '%s'", $variable->name()));
    }
}

$expression = new Mult(
    new Variable('x'),
    new Sum(
        new Value(5),
        new Mult(
            new Variable('y'),
            new Value(2)
        )
    )
);

$variables = array('x' => 10, 'y' => -7);
$evaluator = new Evaluator(new Calculator(), $variables);
$converter = new SmartExpressionToStringConverter();
echo $expression->accept($converter).' = '.$expression->accept($evaluator).PHP_EOL;

Note that the Evaluator can only visit the Variable instances and delegate in Calculator the others expressions., (*6)

The Versions

16/03 2017

dev-master

9999999-dev

Visitor library

  Sources   Download

MIT

The Requires

  • php ^5.5.9|^7.0

 

The Development Requires

by Karel Osorio
by Ivannis SuƔrez

visitor

14/10 2016

dev-issue#77

dev-issue#77

Visitor library

  Sources   Download

MIT

The Requires

  • php ^5.5.9|^7.0

 

The Development Requires

by Karel Osorio
by Ivannis SuƔrez

visitor

05/07 2016

dev-issue#54

dev-issue#54

Visitor library

  Sources   Download

MIT

The Requires

  • php ^5.5.9|^7.0

 

The Development Requires

by Karel Osorio
by Ivannis SuƔrez

visitor

05/07 2016

dev-issue#56

dev-issue#56

Visitor library

  Sources   Download

MIT

The Requires

  • php ^5.5.9|^7.0

 

The Development Requires

by Karel Osorio
by Ivannis SuƔrez

visitor

05/07 2016

dev-issue#63

dev-issue#63

Visitor library

  Sources   Download

MIT

The Requires

  • php ^5.5.9|^7.0

 

The Development Requires

by Karel Osorio
by Ivannis SuƔrez

visitor

05/07 2016

dev-issue#65

dev-issue#65

Visitor library

  Sources   Download

MIT

The Requires

  • php ^5.5.9|^7.0

 

The Development Requires

by Karel Osorio
by Ivannis SuƔrez

visitor

05/07 2016

dev-issue#66

dev-issue#66

Visitor library

  Sources   Download

MIT

The Requires

  • php ^5.5.9|^7.0

 

The Development Requires

by Karel Osorio
by Ivannis SuƔrez

visitor

22/05 2016

dev-issue#41

dev-issue#41

Visitor library

  Sources   Download

MIT

The Requires

  • php ^5.5.9|^7.0

 

The Development Requires

by Karel Osorio
by Ivannis SuƔrez

visitor

29/04 2016

dev-issue#24

dev-issue#24

Visitor library

  Sources   Download

MIT

The Requires

  • php ^5.5.9|^7.0

 

The Development Requires

by Karel Osorio
by Ivannis SuƔrez

visitor

29/04 2016

dev-issue#32

dev-issue#32

Visitor library

  Sources   Download

MIT

The Requires

  • php ^5.5.9|^7.0

 

The Development Requires

by Karel Osorio
by Ivannis SuƔrez

visitor

29/04 2016

dev-issue#34

dev-issue#34

Visitor library

  Sources   Download

MIT

The Requires

  • php ^5.5.9|^7.0

 

The Development Requires

by Karel Osorio
by Ivannis SuƔrez

visitor

29/04 2016

dev-issue#35

dev-issue#35

Visitor library

  Sources   Download

MIT

The Requires

  • php ^5.5.9|^7.0

 

The Development Requires

by Karel Osorio
by Ivannis SuƔrez

visitor

29/04 2016

dev-issue#38

dev-issue#38

Visitor library

  Sources   Download

MIT

The Requires

  • php ^5.5.9|^7.0

 

The Development Requires

by Karel Osorio
by Ivannis SuƔrez

visitor

29/04 2016

dev-issue#40

dev-issue#40

Visitor library

  Sources   Download

MIT

The Requires

  • php ^5.5.9|^7.0

 

The Development Requires

by Karel Osorio
by Ivannis SuƔrez

visitor

29/04 2016

dev-issue#42

dev-issue#42

Visitor library

  Sources   Download

MIT

The Requires

  • php ^5.5.9|^7.0

 

The Development Requires

by Karel Osorio
by Ivannis SuƔrez

visitor

29/04 2016

dev-issue#48

dev-issue#48

Visitor library

  Sources   Download

MIT

The Requires

  • php ^5.5.9|^7.0

 

The Development Requires

by Karel Osorio
by Ivannis SuƔrez

visitor

29/04 2016

dev-issue#51

dev-issue#51

Visitor library

  Sources   Download

MIT

The Requires

  • php ^5.5.9|^7.0

 

The Development Requires

by Karel Osorio
by Ivannis SuƔrez

visitor

20/04 2016

dev-issue#22

dev-issue#22

Visitor library

  Sources   Download

MIT

The Requires

  • php ^5.5.9|^7.0

 

The Development Requires

by Karel Osorio
by Ivannis SuƔrez

visitor