SlideShare ist ein Scribd-Unternehmen logo
1 von 109
Downloaden Sie, um offline zu lesen
{unctionalStructures
byMarcelloDuarte
@_md
f inPHP
@_md#phpbnl17
Expressinganything
@_md#phpbnl17
@_md#phpbnl17
categorytheory
@_md#phpbnl17
categorytheory
somecoolstructures
somearrows
somelaws
{
@_md#phpbnl17
A B
@_md#phpbnl17
A B
"PHPBenelux" 10
@_md#phpbnl17
A B
"PHPBenelux" 10
@_md#phpbnl17
A B
"PHPBenelux"
f
10
@_md#phpbnl17
B
10
C
true
@_md#phpbnl17
B
10
C
true
@_md#phpbnl17
B
10
C
true
g
@_md#phpbnl17
@_md#phpbnl17
github.com/phunkie/phunkie
@_md#phpbnl17
SEMIGROUPS
@_md#phpbnl17
https://upload.wikimedia.org/wikipedia/commons/c/c2/Falkland_Islands_Penguins_40.jpg
@_md#phpbnl17
combine(1, 2) == 3;
combine("a", "b") == "ab";
combine(true, false) == false;
@_md#phpbnl17
h
@_md#phpbnl17
$f = function(string $a): int {
return strlen($a);
};
@_md#phpbnl17
$f = function(string $a): int {
return strlen($a);
};
$g = function(int $b): bool {
return $b % 2 === 0;
};
@_md#phpbnl17
$f = function(string $a): int {
return strlen($a);
};
$g = function(int $b): bool {
return $b % 2 === 0;
};
$h = combine($f, g);
$h("PHPBenelux") == true;
@_md#phpbnl17
combine($f, g) == compose ($f, $g)
// if $f and $g are functions
@_md#phpbnl17
compose ("strlen", odd, Option, ...)
@_md#phpbnl17
laws
@_md#phpbnl17
combine(combine(1, 2), 3) == combine(1, combine(2, 3))
associativity
@_md#phpbnl17
MONOIDS
@_md#phpbnl17
https://upload.wikimedia.org/wikipedia/commons/c/c2/Falkland_Islands_Penguins_40.jpg
@_md#phpbnl17
$identity = function ($x) {
return $x;
};
A
"PHPBenelux"
i
@_md#phpbnl17
zero(42) == 0;
zero("any string") == "";
zero(true, false) == true;
@_md#phpbnl17
laws
@_md#phpbnl17
combine(combine(1, 2), 3) == combine(1, combine(2, 3))
combine(zero($x), $x) == $x
combine($x, zero($x)) == $x
associativity
(left and right) identity
@_md#phpbnl17
interface Monoid extends Semigroup {

public function zero();
// inherited from Semigroup
public function combine($another);
}
@_md#phpbnl17
interface Monoid extends Semigroup {

public function zero();
// inherited from Semigroup
public function combine($another);
}
class Balance implements Monoid { // ... }
@_md#phpbnl17
$deposit100bucks = function(Balance $b) {
return $b->plus(100);
}



$listOfBalances->foldMap($deposit100bucks);
@_md#phpbnl17
FUNCTORS
@_md#phpbnl17
https://upload.wikimedia.org/wikipedia/commons/3/3b/World_Map_1689.JPG
@_md#phpbnl17
kinds
@_md#phpbnl17
proper
{
@_md#phpbnl17
givemeanumber
@_md#phpbnl17
42givemeanumber
@_md#phpbnl17
givemeaword
@_md#phpbnl17
givemeaword "cabuzle"
@_md#phpbnl17
proper
first-order{
@_md#phpbnl17
givemealist
@_md#phpbnl17
givemealist …
@_md#phpbnl17
givemealist alistofwhat?
@_md#phpbnl17
ImmList(1,2,3)
// List<Int>

ImmList("a thing", "another thing")
// List<String>

@_md#phpbnl17
ImmList(1,2,3)
// List<Int>

ImmList("a thing", "another thing")
// List<String>
@_md#phpbnl17
abstract class Option {}
class Some extends Option {}
class None extends Option {}
@_md#phpbnl17
phunkie > Option(42)
$var0: Option<Int> = Some(42)
phunkie > Option(null)
$var1: None = None




@_md#phpbnl17
phunkie > $f = compose(mayBeRubish, Option)

phunkie > $f(42)
$var0: None = None




@_md#phpbnl17
proper
first-order
higherorder
{
@_md#phpbnl17
function fmap(Mappable $mappable, callable $f) {
return $mappable->map($f);
}
@_md#phpbnl17
$listOfWords = ImmList("guacamole", "nose", "penguin");
$lengths = fmap ("strlen") ($listOfWords);
// List (9, 4, 7)
@_md#phpbnl17
$maybeSomeGuaca = Option("guacamole");
$length = fmap ("strlen") ($maybeSomeGuaca);
// Some (9)
@_md#phpbnl17
$maybeSomeGuaca = Option("guacamole");
$length = fmap ("strlen") ($maybeSomeGuaca);
// Some (9)
$maybeSomeGuaca = Option(null);
$length = fmap ("strlen") ($maybeSomeGuaca);



// None
@_md#phpbnl17
// Already Mappable in Phunkie
ImmList
Option
Function1
Validations (Either)
// Planned
ImmMap
ImmSet
Tuples (inc. Pair)
@_md#phpbnl17
laws
@_md#phpbnl17
$fa == fmap(identity)($fa)
fmap(compose($f, $g))($fa) == fmap($g)(fmap($f)($fa))
covariant identity
covariant composition
@_md#phpbnl17
APPLICATIVE
@_md#phpbnl17
https://upload.wikimedia.org/wikipedia/commons/5/5c/Brick_and_block_laying.jpg
@_md#phpbnl17
interface Apply extends Functor

{
public function apply($ff);

public function map2($fb, callable $f);

}
interface Applicative extends Apply

{

public function pure($a);

}
@_md#phpbnl17
/**
* @param A $a
* @return FirstOrderKind<A>
*/
function pure($a)
@_md#phpbnl17
/**
* @param A $a
* @return FirstOrderKind<A>
*/
function pure($a)
Option()->pure(42);
// Some(42)
@_md#phpbnl17
/**
* @param A $a
* @return FirstOrderKind<A>
*/
function pure($a)
Option()->pure(42);
// Some(42)
ImmList()->pure(42);
// ImmList(42)
@_md#phpbnl17
/**
* @param FirstOrderKind<callable<A,B>> $ff
* @return FirstOrderKind<B>
*/
function apply($ff)
@_md#phpbnl17
/**
* @param FirstOrderKind<callable<A,B>> $ff
* @return FirstOrderKind<B>
*/
function apply($ff)
$increment = function($x){ return $x + 1;};


@_md#phpbnl17
/**
* @param FirstOrderKind<callable<A,B>> $ff
* @return FirstOrderKind<B>
*/
function apply($ff)
Some(1)->apply(Some($increment));
@_md#phpbnl17
/**
* @param FirstOrderKind<callable<A,B>> $ff
* @return FirstOrderKind<B>
*/
function apply($ff)
Some(1)->apply(Some($increment));
// Some(2)

@_md#phpbnl17
/**
* @param FirstOrderKind<callable<A,B>> $ff
* @return FirstOrderKind<B>
*/
function apply($ff)
Some(1)->apply(Some($increment));
// Some(2)

None()->apply(Some($increment));

@_md#phpbnl17
/**
* @param FirstOrderKind<callable<A,B>> $ff
* @return FirstOrderKind<B>
*/
function apply($ff)
Some(1)->apply(Some($increment));
// Some(2)

None()->apply(Some($increment));

// None
@_md#phpbnl17
/**
* @param FirstOrderKind<callable<A,B>> $ff
* @return FirstOrderKind<B>
*/
function apply($ff)
Some(1)->apply(Some($increment));
// Some(2)

None()->apply(Some($increment));

// None
ImmList(1,2,3)->apply(ImmList($increment));

@_md#phpbnl17
/**
* @param FirstOrderKind<callable<A,B>> $ff
* @return FirstOrderKind<B>
*/
function apply($ff)
Some(1)->apply(Some($increment));
// Some(2)

None()->apply(Some($increment));

// None
ImmList(1,2,3)->apply(ImmList($increment));

// ImmList(2,3,4)
@_md#phpbnl17
/**
* @param FirstOrderKind<B> $fb
* @param (A, B) => C $
* @return FirstOrderKind<C>
*/
function map2($fb, callable $f)
@_md#phpbnl17
/**
* @param FirstOrderKind<B> $fb
* @param (A, B) => C $
* @return FirstOrderKind<C>
*/
function map2($fb, callable $f)
Some(1)->map2(Some(2), function($x, $y) { return $x + $y; });;
@_md#phpbnl17
/**
* @param FirstOrderKind<B> $fb
* @param (A, B) => C $
* @return FirstOrderKind<C>
*/
function map2($fb, callable $f)
Some(1)->map2(Some(2), function($x, $y) { return $x + $y; });;
@_md#phpbnl17
/**
* @param FirstOrderKind<B> $fb
* @param (A, B) => C $
* @return FirstOrderKind<C>
*/
function map2($fb, callable $f)
Some(1)->map2(Some(2), function($x, $y) { return $x + $y; });;
// Some(3)

@_md#phpbnl17
/**
* @param FirstOrderKind<B> $fb
* @param (A, B) => C $
* @return FirstOrderKind<C>
*/
function map2($fb, callable $f)
Some(1)->map2(Some(2), function($x, $y) { return $x + $y; });;
// Some(3)

ImmList(1,2)->map2(ImmList(4,5),
function($x, $y) { return $x + $y; });

@_md#phpbnl17
/**
* @param FirstOrderKind<B> $fb
* @param (A, B) => C $
* @return FirstOrderKind<C>
*/
function map2($fb, callable $f)
Some(1)->map2(Some(2), function($x, $y) { return $x + $y; });;
// Some(3)

ImmList(1,2)->map2(ImmList(4,5),
function($x, $y) { return $x + $y; });

// ImmList(5,6,6,7)
@_md#phpbnl17
laws
@_md#phpbnl17
$fa->apply($fa->pure(identity)) == $fa
$fa->pure($a)->fa->apply($fa->pure($f)) ==

$fa->pure($f($a))
identity
homomorphism
@_md#phpbnl17
$fa->pure($a)->apply ==

$fab->apply($fa->pure(function($f)use($a){return $f($a)}))
$fa->map($f) == $fa->apply($fa->pure($f))
interchange
map
@_md#phpbnl17
whywouldyoueveruseafunctor?
@_md#phpbnl17
weakertypesaremorepredictable
@_md#phpbnl17
$xs = fmap (ImmList(1,2,3)) ($f);
echo $xs->length;
@_md#phpbnl17
MONADS
@_md#phpbnl17
https://upload.wikimedia.org/wikipedia/commons/b/bd/Golden_tabby_and_white_kitten_n01.jpg
@_md#phpbnl17
interface FlatMap extends Functor

{
public function flatMap(callable $f);

}
interface Monad extends FlatMap

{

public function flatten();

}
@_md#phpbnl17
/**
* @param (A) -> FirstOrderKind<B> $a
* @return FirstOrderKind<B>
*/
function flatMap($a)
@_md#phpbnl17
/**
* @param (A) -> FirstOrderKind<B> $a
* @return FirstOrderKind<B>
*/
function flatMap($a)
Option(42)->flatMap(function($x) { return Some($x + 1); });
@_md#phpbnl17
/**
* @param (A) -> FirstOrderKind<B> $a
* @return FirstOrderKind<B>
*/
function flatMap($a)
Option(42)->flatMap(function($x) { return Some($x + 1); });
@_md#phpbnl17
/**
* @param (A) -> FirstOrderKind<B> $a
* @return FirstOrderKind<B>
*/
function flatMap($a)
Option(42)->flatMap(function($x) { return Some($x + 1); });
@_md#phpbnl17
/**
* @param (A) -> FirstOrderKind<B> $a
* @return FirstOrderKind<B>
*/
function flatMap($a)
Option(42)->flatMap(function($x) { return Some($x + 1); });
// Some(43)
@_md#phpbnl17
/**
* @param (A) -> FirstOrderKind<B> $a
* @return FirstOrderKind<B>
*/
function flatMap($a)
Option(42)->flatMap(function($x) { return Some($x + 1); });
// Some(43)
ImmList(1,2,3)->flatMap(function($x) {
return Option($x % 2 === 0 ? null : $x); });
// ImmList(1,3)
@_md#phpbnl17
/**
* @return FirstOrderKind<B>
*/
function flatten()
Some(Some(42))->flatten();
// Some(42)
@_md#phpbnl17
/**
* @param (A) -> FirstOrderKind<B> $a
* @return FirstOrderKind<B>
*/
function flatMap($a)
Option(42)->flatMap(function($x) { return Some($x + 1); });
// Some(43)
ImmList(1,2,3)->flatMap(function($x) {
return Option($x % 2 === 0 ? null : $x); });
// ImmList(1,3)
@_md#phpbnl17
laws
@_md#phpbnl17
$fa->flatMap($f)->flatMap($g) == $fa->flatMap(function($a) use ($f,$g) {
return $f($a)->flatMap( function($b) use ($g) { return $g($b); } ) ;})
$fa->pure($a)->flatMap($f) == $f($a)
associativity
right and left identity
$fa->flatMap(function($a) use ($fa) { return $fa-
>pure($a); }) == $fa;
@_md#phpbnl17
monadsyntaxsugar
@_md#phpbnl17
function repl($state)

{

return read()->

flatMap(evaluate)->

flatMap(andPrint)->

flatMap(loop)

->run($state);

}
def repl(state) =

for {
(s,input) <- read

(s,result)<- evaluate

s <- andPrint

s <- loop

} yield s

@_md#phpbnl17
monadcomposability
@_md#phpbnl17
f(A $a): M<B>



g(B $b): M<C>
f(a) ~= M<B>

f(a) map g ~= M<M<C>>


f(a) ~= M<B>

f(a) map g ~= M<M<C>>


urgh!
@_md#phpbnl17
butyoucancomposethemonad’sfunctions!


flatten f(a) map g ~= M<C>


@_md#phpbnl17
VALIDATIONS
@_md#phpbnl17
http://www.sbs.com.au/topics/sites/sbs.com.au.topics/files/gettyimages-470309868.jpg
@_md#phpbnl17
abstract class Validation {}
class Success extends Validation {}
class Failure extends Validation {}
@_md#phpbnl17
phunkie > Success(42)
$var0: Validation<E, Int> = Success(42)
phunkie > Failure("nay")
$var0: Validation<String, A> = Failure("nay")




@_md#phpbnl17
phunkie > Either("nay")(42)
$var0: Validation<E, Int> = Success(42)
phunkie > Either("nay")(null)
$var0: Validation<String, A> = Failure("nay")




@_md#phpbnl17
marcelloduarte
@PhunkiePhp
{
@_md#phpbnl17
thanks
{bit.ly/inviqa-contact bit.ly/inviqa-careers
you!
@_md#phpbnl17
credits
https://upload.wikimedia.org/wikipedia/commons/c/c2/Falkland_Islands_Penguins_40.jpg
{https://upload.wikimedia.org/wikipedia/commons/3/3b/World_Map_1689.JPG
https://upload.wikimedia.org/wikipedia/commons/5/5c/Brick_and_block_laying.jpg
https://upload.wikimedia.org/wikipedia/commons/b/bd/Golden_tabby_and_white_kitten_n01.jpg
@_md#phpbnl17
Questions?


joind.in/talk/75f65
?

Weitere ähnliche Inhalte

Was ist angesagt?

OSDC.TW - Gutscript for PHP haters
OSDC.TW - Gutscript for PHP hatersOSDC.TW - Gutscript for PHP haters
OSDC.TW - Gutscript for PHP haters
Lin Yo-An
 
Jsphp 110312161301-phpapp02
Jsphp 110312161301-phpapp02Jsphp 110312161301-phpapp02
Jsphp 110312161301-phpapp02
Seri Moth
 
The Joy of Smartmatch
The Joy of SmartmatchThe Joy of Smartmatch
The Joy of Smartmatch
Andrew Shitov
 

Was ist angesagt? (20)

Learning Perl 6 (NPW 2007)
Learning Perl 6 (NPW 2007)Learning Perl 6 (NPW 2007)
Learning Perl 6 (NPW 2007)
 
The Perl6 Type System
The Perl6 Type SystemThe Perl6 Type System
The Perl6 Type System
 
Code Generation in PHP - PHPConf 2015
Code Generation in PHP - PHPConf 2015Code Generation in PHP - PHPConf 2015
Code Generation in PHP - PHPConf 2015
 
OSDC.TW - Gutscript for PHP haters
OSDC.TW - Gutscript for PHP hatersOSDC.TW - Gutscript for PHP haters
OSDC.TW - Gutscript for PHP haters
 
PHPUnit でよりよくテストを書くために
PHPUnit でよりよくテストを書くためにPHPUnit でよりよくテストを書くために
PHPUnit でよりよくテストを書くために
 
I, For One, Welcome Our New Perl6 Overlords
I, For One, Welcome Our New Perl6 OverlordsI, For One, Welcome Our New Perl6 Overlords
I, For One, Welcome Our New Perl6 Overlords
 
PHP Enums - PHPCon Japan 2021
PHP Enums - PHPCon Japan 2021PHP Enums - PHPCon Japan 2021
PHP Enums - PHPCon Japan 2021
 
Learning Perl 6
Learning Perl 6 Learning Perl 6
Learning Perl 6
 
Php unit the-mostunknownparts
Php unit the-mostunknownpartsPhp unit the-mostunknownparts
Php unit the-mostunknownparts
 
Business Rules with Brick
Business Rules with BrickBusiness Rules with Brick
Business Rules with Brick
 
Xlab #1: Advantages of functional programming in Java 8
Xlab #1: Advantages of functional programming in Java 8Xlab #1: Advantages of functional programming in Java 8
Xlab #1: Advantages of functional programming in Java 8
 
Jsphp 110312161301-phpapp02
Jsphp 110312161301-phpapp02Jsphp 110312161301-phpapp02
Jsphp 110312161301-phpapp02
 
The Joy of Smartmatch
The Joy of SmartmatchThe Joy of Smartmatch
The Joy of Smartmatch
 
Diving into HHVM Extensions (php[tek] 2016)
Diving into HHVM Extensions (php[tek] 2016)Diving into HHVM Extensions (php[tek] 2016)
Diving into HHVM Extensions (php[tek] 2016)
 
Unit testing with zend framework PHPBenelux
Unit testing with zend framework PHPBeneluxUnit testing with zend framework PHPBenelux
Unit testing with zend framework PHPBenelux
 
PHP Language Trivia
PHP Language TriviaPHP Language Trivia
PHP Language Trivia
 
Oops in php
Oops in phpOops in php
Oops in php
 
Unit testing with zend framework tek11
Unit testing with zend framework tek11Unit testing with zend framework tek11
Unit testing with zend framework tek11
 
November Camp - Spec BDD with PHPSpec 2
November Camp - Spec BDD with PHPSpec 2November Camp - Spec BDD with PHPSpec 2
November Camp - Spec BDD with PHPSpec 2
 
Workshop unittesting
Workshop unittestingWorkshop unittesting
Workshop unittesting
 

Ähnlich wie Functional Structures in PHP

Php Reusing Code And Writing Functions
Php Reusing Code And Writing FunctionsPhp Reusing Code And Writing Functions
Php Reusing Code And Writing Functions
mussawir20
 
PHP and Rich Internet Applications
PHP and Rich Internet ApplicationsPHP and Rich Internet Applications
PHP and Rich Internet Applications
elliando dias
 
Good Evils In Perl
Good Evils In PerlGood Evils In Perl
Good Evils In Perl
Kang-min Liu
 
JavaScript for PHP developers
JavaScript for PHP developersJavaScript for PHP developers
JavaScript for PHP developers
Stoyan Stefanov
 
jQuery: out with the old, in with the new
jQuery: out with the old, in with the newjQuery: out with the old, in with the new
jQuery: out with the old, in with the new
Remy Sharp
 
Introducing PHP Latest Updates
Introducing PHP Latest UpdatesIntroducing PHP Latest Updates
Introducing PHP Latest Updates
Iftekhar Eather
 
Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)
Kang-min Liu
 

Ähnlich wie Functional Structures in PHP (20)

Functional php
Functional phpFunctional php
Functional php
 
PHP in 2018 - Q4 - AFUP Limoges
PHP in 2018 - Q4 - AFUP LimogesPHP in 2018 - Q4 - AFUP Limoges
PHP in 2018 - Q4 - AFUP Limoges
 
Php Reusing Code And Writing Functions
Php Reusing Code And Writing FunctionsPhp Reusing Code And Writing Functions
Php Reusing Code And Writing Functions
 
PHP and Rich Internet Applications
PHP and Rich Internet ApplicationsPHP and Rich Internet Applications
PHP and Rich Internet Applications
 
Symfony tips and tricks
Symfony tips and tricksSymfony tips and tricks
Symfony tips and tricks
 
Functional Programming in PHP
Functional Programming in PHPFunctional Programming in PHP
Functional Programming in PHP
 
Go OO! - Real-life Design Patterns in PHP 5
Go OO! - Real-life Design Patterns in PHP 5Go OO! - Real-life Design Patterns in PHP 5
Go OO! - Real-life Design Patterns in PHP 5
 
Meet Magento Sweden - Magento 2 Layout and Code Compilation for Performance
Meet Magento Sweden - Magento 2 Layout and Code Compilation for PerformanceMeet Magento Sweden - Magento 2 Layout and Code Compilation for Performance
Meet Magento Sweden - Magento 2 Layout and Code Compilation for Performance
 
Good Evils In Perl
Good Evils In PerlGood Evils In Perl
Good Evils In Perl
 
JavaScript for PHP developers
JavaScript for PHP developersJavaScript for PHP developers
JavaScript for PHP developers
 
Symfony CMF - PHP Conference Brazil 2011
Symfony CMF - PHP Conference Brazil 2011Symfony CMF - PHP Conference Brazil 2011
Symfony CMF - PHP Conference Brazil 2011
 
PHP7 - Scalar Type Hints & Return Types
PHP7 - Scalar Type Hints & Return TypesPHP7 - Scalar Type Hints & Return Types
PHP7 - Scalar Type Hints & Return Types
 
jQuery: out with the old, in with the new
jQuery: out with the old, in with the newjQuery: out with the old, in with the new
jQuery: out with the old, in with the new
 
Generating Power with Yield
Generating Power with YieldGenerating Power with Yield
Generating Power with Yield
 
Ethiopian multiplication in Perl6
Ethiopian multiplication in Perl6Ethiopian multiplication in Perl6
Ethiopian multiplication in Perl6
 
Elements of Functional Programming in PHP
Elements of Functional Programming in PHPElements of Functional Programming in PHP
Elements of Functional Programming in PHP
 
Introducing PHP Latest Updates
Introducing PHP Latest UpdatesIntroducing PHP Latest Updates
Introducing PHP Latest Updates
 
Can't Miss Features of PHP 5.3 and 5.4
Can't Miss Features of PHP 5.3 and 5.4Can't Miss Features of PHP 5.3 and 5.4
Can't Miss Features of PHP 5.3 and 5.4
 
Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)
 
Why async and functional programming in PHP7 suck and how to get overr it?
Why async and functional programming in PHP7 suck and how to get overr it?Why async and functional programming in PHP7 suck and how to get overr it?
Why async and functional programming in PHP7 suck and how to get overr it?
 

Mehr von Marcello Duarte

Mehr von Marcello Duarte (14)

Empathy from Agility
Empathy from AgilityEmpathy from Agility
Empathy from Agility
 
Introducing Eager Design
Introducing Eager DesignIntroducing Eager Design
Introducing Eager Design
 
Understanding Craftsmanship SwanseaCon2015
Understanding Craftsmanship SwanseaCon2015Understanding Craftsmanship SwanseaCon2015
Understanding Craftsmanship SwanseaCon2015
 
Transitioning to Agile
Transitioning to AgileTransitioning to Agile
Transitioning to Agile
 
Understanding craftsmanship
Understanding craftsmanshipUnderstanding craftsmanship
Understanding craftsmanship
 
Hexagonal symfony
Hexagonal symfonyHexagonal symfony
Hexagonal symfony
 
The framework as an implementation detail
The framework as an implementation detailThe framework as an implementation detail
The framework as an implementation detail
 
PhpSpec 2.0 ilustrated by examples
PhpSpec 2.0 ilustrated by examplesPhpSpec 2.0 ilustrated by examples
PhpSpec 2.0 ilustrated by examples
 
Emergent design with phpspec
Emergent design with phpspecEmergent design with phpspec
Emergent design with phpspec
 
Pair Programming, TDD and other impractical things
Pair Programming, TDD and other impractical thingsPair Programming, TDD and other impractical things
Pair Programming, TDD and other impractical things
 
Deliberate practice
Deliberate practiceDeliberate practice
Deliberate practice
 
BDD For Zend Framework With PHPSpec
BDD For Zend Framework With PHPSpecBDD For Zend Framework With PHPSpec
BDD For Zend Framework With PHPSpec
 
PHPSpec BDD for PHP
PHPSpec BDD for PHPPHPSpec BDD for PHP
PHPSpec BDD for PHP
 
PHPSpec BDD Framework
PHPSpec BDD FrameworkPHPSpec BDD Framework
PHPSpec BDD Framework
 

Kürzlich hochgeladen

AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
VictorSzoltysek
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
Health
 
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfintroduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
VishalKumarJha10
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
9953056974 Low Rate Call Girls In Saket, Delhi NCR
 

Kürzlich hochgeladen (20)

Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Models
 
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
 
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdf
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdfAzure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdf
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdf
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students
 
Define the academic and professional writing..pdf
Define the academic and professional writing..pdfDefine the academic and professional writing..pdf
Define the academic and professional writing..pdf
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with Precision
 
How to Choose the Right Laravel Development Partner in New York City_compress...
How to Choose the Right Laravel Development Partner in New York City_compress...How to Choose the Right Laravel Development Partner in New York City_compress...
How to Choose the Right Laravel Development Partner in New York City_compress...
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
 
A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docx
 
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionIntroducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
 
10 Trends Likely to Shape Enterprise Technology in 2024
10 Trends Likely to Shape Enterprise Technology in 202410 Trends Likely to Shape Enterprise Technology in 2024
10 Trends Likely to Shape Enterprise Technology in 2024
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learn
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
 
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfintroduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
 

Functional Structures in PHP