mirror of
https://github.com/wataridori/solid-php-example.git
synced 2024-12-04 19:03:30 +00:00
Init
This commit is contained in:
commit
c509e66670
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
.idea
|
||||
.DS_Store
|
63
1-single-responsibility-principle.php
Normal file
63
1-single-responsibility-principle.php
Normal file
@ -0,0 +1,63 @@
|
||||
<?php
|
||||
|
||||
// Single Responsibility Principle Violation
|
||||
class Report
|
||||
{
|
||||
public function getTitle()
|
||||
{
|
||||
return 'Report Title';
|
||||
}
|
||||
|
||||
public function getDate()
|
||||
{
|
||||
return '2016-04-21';
|
||||
}
|
||||
|
||||
public function getContents()
|
||||
{
|
||||
return [
|
||||
'title' => $this->getTitle(),
|
||||
'date' => $this->getDate(),
|
||||
];
|
||||
}
|
||||
|
||||
public function formatJson()
|
||||
{
|
||||
return json_encode($this->getContents());
|
||||
}
|
||||
}
|
||||
|
||||
// Refactored
|
||||
class Report
|
||||
{
|
||||
public function getTitle()
|
||||
{
|
||||
return 'Report Title';
|
||||
}
|
||||
|
||||
public function getDate()
|
||||
{
|
||||
return '2016-04-21';
|
||||
}
|
||||
|
||||
public function getContents()
|
||||
{
|
||||
return [
|
||||
'title' => $this->getTitle(),
|
||||
'date' => $this->getDate(),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
interface ReportFormattable
|
||||
{
|
||||
public function format(Report $report);
|
||||
}
|
||||
|
||||
class JsonReportFormatter implements ReportFormattable
|
||||
{
|
||||
public function format(Report $report)
|
||||
{
|
||||
return json_encode($report->getContents());
|
||||
}
|
||||
}
|
62
2-open-closed-principle.php
Normal file
62
2-open-closed-principle.php
Normal file
@ -0,0 +1,62 @@
|
||||
<?php
|
||||
|
||||
// Open Closed Principle Violation
|
||||
class Programmer
|
||||
{
|
||||
public function code()
|
||||
{
|
||||
return 'coding';
|
||||
}
|
||||
}
|
||||
|
||||
class Tester
|
||||
{
|
||||
public function test()
|
||||
{
|
||||
return 'testing';
|
||||
}
|
||||
}
|
||||
|
||||
class ProjectManagement
|
||||
{
|
||||
public function process($member)
|
||||
{
|
||||
if ($member instanceof Programmer) {
|
||||
$member->code();
|
||||
} elseif ($member instanceof Tester) {
|
||||
$member->test();
|
||||
};
|
||||
|
||||
throw new Exception('Invalid input member');
|
||||
}
|
||||
}
|
||||
|
||||
// Refactored
|
||||
interface Workable
|
||||
{
|
||||
public function work();
|
||||
}
|
||||
|
||||
class Programmer implements Workable
|
||||
{
|
||||
public function work()
|
||||
{
|
||||
return 'coding';
|
||||
}
|
||||
}
|
||||
|
||||
class Tester implements Workable
|
||||
{
|
||||
public function work()
|
||||
{
|
||||
return 'testing';
|
||||
}
|
||||
}
|
||||
|
||||
class ProjectManagement
|
||||
{
|
||||
public function process(Workable $member)
|
||||
{
|
||||
return $member->work();
|
||||
}
|
||||
}
|
66
3-liskov-substitution-principle.php
Normal file
66
3-liskov-substitution-principle.php
Normal file
@ -0,0 +1,66 @@
|
||||
<?php
|
||||
|
||||
// Liskov Substitution Principle Violation
|
||||
// The Rectangle - Square problem
|
||||
class Rectangle
|
||||
{
|
||||
protected $width;
|
||||
protected $height;
|
||||
|
||||
public function setHeight($height)
|
||||
{
|
||||
$this->height = $height;
|
||||
}
|
||||
|
||||
public function getHeight()
|
||||
{
|
||||
return $this->height;
|
||||
}
|
||||
|
||||
public function setWidth($width)
|
||||
{
|
||||
$this->width = $width;
|
||||
}
|
||||
|
||||
public function getWidth()
|
||||
{
|
||||
return $this->width;
|
||||
}
|
||||
|
||||
public function area()
|
||||
{
|
||||
return $this->height * $this->width;
|
||||
}
|
||||
}
|
||||
|
||||
class Square extends Rectangle
|
||||
{
|
||||
public function setHeight($value)
|
||||
{
|
||||
$this->width = $value;
|
||||
$this->height = $value;
|
||||
}
|
||||
|
||||
public function setWidth($value)
|
||||
{
|
||||
$this->width = $value;
|
||||
$this->height = $value;
|
||||
}
|
||||
}
|
||||
|
||||
class RectangleTest
|
||||
{
|
||||
private $rectangle;
|
||||
|
||||
public function __construct(Rectangle $rectangle)
|
||||
{
|
||||
$this->rectangle = $rectangle;
|
||||
}
|
||||
|
||||
public function testArea()
|
||||
{
|
||||
$this->rectangle->setHeight(2);
|
||||
$this->rectangle->setWidth(3);
|
||||
// Expect rectangle's area to be 6
|
||||
}
|
||||
}
|
94
4-interface-segregation-principle.php
Normal file
94
4-interface-segregation-principle.php
Normal file
@ -0,0 +1,94 @@
|
||||
<?php
|
||||
|
||||
// Interface Segregation Principle Violation
|
||||
interface Workable
|
||||
{
|
||||
public function code();
|
||||
public function test();
|
||||
}
|
||||
|
||||
class Programmer implements Workable
|
||||
{
|
||||
public function canCode()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public function code()
|
||||
{
|
||||
return 'coding';
|
||||
}
|
||||
|
||||
public function test()
|
||||
{
|
||||
return 'testing in localhost';
|
||||
}
|
||||
}
|
||||
|
||||
class Tester implements Workable
|
||||
{
|
||||
public function canCode()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function code()
|
||||
{
|
||||
throw new Exception('Opps! I can not code');
|
||||
}
|
||||
|
||||
public function test()
|
||||
{
|
||||
return 'testing in test server';
|
||||
}
|
||||
}
|
||||
|
||||
class ProjectManagement
|
||||
{
|
||||
public function processCode(Workable $member)
|
||||
{
|
||||
if ($member->canCode()) {
|
||||
$member->code();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Refactored
|
||||
interface Codeable
|
||||
{
|
||||
public function code();
|
||||
}
|
||||
|
||||
interface Testable
|
||||
{
|
||||
public function test();
|
||||
}
|
||||
|
||||
class Programmer implements Codeable, Testable
|
||||
{
|
||||
public function code()
|
||||
{
|
||||
return 'coding';
|
||||
}
|
||||
|
||||
public function test()
|
||||
{
|
||||
return 'testing in localhost';
|
||||
}
|
||||
}
|
||||
|
||||
class Tester implements Workable
|
||||
{
|
||||
public function test()
|
||||
{
|
||||
return 'testing in test server';
|
||||
}
|
||||
}
|
||||
|
||||
class ProjectManagement
|
||||
{
|
||||
public function processCode(Codeable $member)
|
||||
{
|
||||
$member->code();
|
||||
}
|
||||
}
|
48
5-dependency-inversion-principle.php
Normal file
48
5-dependency-inversion-principle.php
Normal file
@ -0,0 +1,48 @@
|
||||
<?php
|
||||
// Dependency Inversion Principle Violation
|
||||
class Mailer
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
class SendWelcomeMessage
|
||||
{
|
||||
private $mailer;
|
||||
|
||||
public function __construct(Mailer $mailer)
|
||||
{
|
||||
$this->mailer = $mailer;
|
||||
}
|
||||
}
|
||||
|
||||
// Refactored
|
||||
interface Mailer
|
||||
{
|
||||
public function send();
|
||||
}
|
||||
|
||||
class SmtpMailer implements Mailer
|
||||
{
|
||||
public function send()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
class SendGridMailer implements Mailer
|
||||
{
|
||||
public function send()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
class SendWelcomeMessage
|
||||
{
|
||||
private $mailer;
|
||||
|
||||
public function __construct(Mailer $mailer)
|
||||
{
|
||||
$this->mailer = $mailer;
|
||||
}
|
||||
}
|
18
readme.md
Normal file
18
readme.md
Normal file
@ -0,0 +1,18 @@
|
||||
## SOLID Principles Examples in PHP
|
||||
|
||||
### Single Responsibility Principle
|
||||
A class should have one, and only one, reason to change. [Example](./1-single-responsibility-principle.php)
|
||||
|
||||
### Open Closed Principle
|
||||
A class should be open for extension, but closed for modification. [Example](./2-open-closed-principle.php)
|
||||
|
||||
### Liskov Substitution Principle
|
||||
Derived classes must be substitutable for their base classes. [Example](./3-liskov-substitution-principle.php)
|
||||
|
||||
### Interface Segregation Principle
|
||||
Many client-specific interfaces are better than one general-purpose interface. [Example](./4-interface-segregation-principle.php)
|
||||
|
||||
### Dependency Inversion Principle
|
||||
Depend upon abstractions. Do not depend upon concretions. [Example](./5-dependency-inversion-principle.php)
|
||||
|
||||
#### For more information about *Object Oriented Design Principles*, you can refer [this slide](https://viblo.asia/thangtd90/posts/pVYRPJPmG4ng)
|
Loading…
Reference in New Issue
Block a user