Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Functions in PHP: Part 1 - Writing Your Own Functions

Functions in PHP: Part 1 - Writing Your Own Functions

John Kary discusses 4 guidelines that if followed will result in clear, focused functions that are easy to read, reason about and reuse. Examples are shown in PHP.

John Kary

July 29, 2015
Tweet

More Decks by John Kary

Other Decks in Programming

Transcript

  1. unctions in PHP
    Part 1: Writing Your Own Functions
    ƒ

    View Slide

  2. !
    $hash = array(
    'username' => 'john',
    'food' => 'bacon',
    );
    !
    echo http_build_query($hash);
    !
    // The above code would output...
    username=john&food=bacon

    View Slide

  3. !
    $hash = array(
    'username' => 'john',
    'food' => 'bacon',
    );
    !
    echo http_build_query($hash);
    !
    // The above code would output...
    username=john&food=bacon

    View Slide

  4. function sum($foo, $bar) {
    return $foo + $bar;
    }

    View Slide

  5. function sum($foo, $bar) {
    return $foo + $bar;
    }
    echo sum(2, 2);

    View Slide

  6. function sum($foo, $bar) {
    return $foo + $bar;
    }
    echo sum(2, 2);
    4

    View Slide

  7. function sum($foo, $bar) {
    return $foo + $bar;
    }
    echo sum(2, 2);
    4
    echo sum(16, 8);

    View Slide

  8. function sum($foo, $bar) {
    return $foo + $bar;
    }
    echo sum(2, 2);
    4
    echo sum(16, 8);
    24

    View Slide

  9. Blocks of Reusable Code

    View Slide

  10. Blocks of Reusable Code
    Easy to read and digest

    View Slide

  11. Blocks of Reusable Code
    Easy to read and digest
    Easier to Maintain

    View Slide

  12. Anatomy!
    of Functions

    View Slide

  13. function announce_sum($foo, $bar) {
    $sum = $foo + $bar;
    return $sum;
    }
    Function Keyword

    View Slide

  14. function announce_sum($foo, $bar) {
    $sum = $foo + $bar;
    return $sum;
    }
    Name

    View Slide

  15. function announce_sum($foo, $bar) {
    $sum = $foo + $bar;
    return $sum;
    }
    Arguments

    View Slide

  16. function announce_sum($foo, $bar) {
    $sum = $foo + $bar;
    return $sum;
    }
    Body

    View Slide

  17. function announce_sum($foo, $bar) {
    $sum = $foo + $bar;
    return $sum;
    }
    Return

    View Slide

  18. View Slide

  19. Given

    View Slide

  20. Given
    Expect

    View Slide

  21. Given
    Expect
    Behavior

    View Slide

  22. Given!
    List of all Users

    View Slide

  23. Given!
    List of all Users
    Expect!
    New list of Users whose name starts with J

    View Slide

  24. Given!
    List of all Users
    Users With J Names
    Expect!
    New list of Users whose name starts with J

    View Slide

  25. function users_with_j_names($users) {
    $filtered = array();
    !
    // ... do some work ...
    return $filtered;
    }

    View Slide

  26. function users_with_j_names($users) {
    $filtered = array();
    !
    // ... do some work ...
    return $filtered;
    }

    View Slide

  27. 1. Well Named
    Describes what the function does!
    not how it does it

    View Slide

  28. function users_with_j_names($users) {
    $filtered = array();
    !
    // ... do some work ...
    return $filtered;
    }

    View Slide

  29. foreach ($users as $user) {
    if (0 === strpos($user['name'], 'J')) {
    $filtered[] = $user;
    }
    }
    function users_with_j_names($users) {
    $filtered = array();
    return $filtered;
    }

    View Slide

  30. foreach ($users as $user) {
    if (0 === strpos($user['name'], 'J')) {
    $filtered[] = $user;
    }
    }
    function users_with_j_names($users) {
    $filtered = array();
    return $filtered;
    }

    View Slide

  31. foreach ($users as $user) {
    if (0 === strpos($user['name'], 'J')) {
    $filtered[] = $user;
    }
    }
    function users_with_j_names($users) {
    $filtered = array();
    return $filtered;
    }

    View Slide

  32. Users With J Names
    Users With K Names
    Users With L Names
    Users With M Names
    Users With N Names
    Users With O Names

    View Slide

  33. Given!
    List of all Users
    One Letter
    !
    Expect!
    New list of Users whose name starts with One Letter

    View Slide

  34. Given!
    List of all Users
    One Letter
    !
    Expect!
    New list of Users whose name starts with One Letter
    Users Name Begins With

    View Slide

  35. function users_name_begins_with($users, $letter) {
    $filtered = array();
    !
    foreach ($users as $user) {
    if (0 === strpos($user['name'], $letter)) {
    $filtered[] = $user;
    }
    }
    return $filtered;
    }

    View Slide

  36. function users_name_begins_with($users, $letter) {
    $filtered = array();
    !
    foreach ($users as $user) {
    if (0 === strpos($user['name'], $letter)) {
    $filtered[] = $user;
    }
    }
    return $filtered;
    }

    View Slide

  37. 2. Change vs Same
    Separate what changes!
    from what stays the same

    View Slide

  38. 2. Change vs Same
    Separate what changes!
    from what stays the same
    Arguments

    View Slide

  39. 2. Change vs Same
    Separate what changes!
    from what stays the same
    Behavior
    Arguments

    View Slide

  40. function users_name_begins_with($users, $letter) {
    $filtered = array();
    !
    foreach ($users as $user) {
    if (0 === strpos($user['name'], $letter)) {
    $filtered[] = $user;
    }
    }
    return $filtered;
    }

    View Slide

  41. function users_name_begins_with($users, $letter) {
    $filtered = array();
    !
    foreach ($users as $user) {
    if (0 === strpos($user['name'], $letter)) {
    $filtered[] = $user;
    }
    }
    return $filtered;
    }
    1. Well Named

    View Slide

  42. function users_name_begins_with($users, $letter) {
    $filtered = array();
    !
    foreach ($users as $user) {
    if (0 === strpos($user['name'], $letter)) {
    $filtered[] = $user;
    }
    }
    return $filtered;
    }
    1. Well Named
    2. Change vs Same

    View Slide

  43. 3. One Return Type
    Return the same value type!
    given any input

    View Slide

  44. Integer!
    Float!
    Boolean!
    String!
    Array!
    Object
    0 1 2 3!
    0.0 1.0 3.14!
    true false!
    "hello" ""!
    array() array('john', 'eric', 'dan')!
    DateTime User
    3. One Return Type

    View Slide

  45. function users_name_begins_with($users, $letter) {
    $filtered = array();
    !
    foreach ($users as $user) {
    if (0 === strpos($user['name'], $letter)) {
    $filtered[] = $user;
    }
    }
    !
    return $filtered;
    }

    View Slide

  46. function users_name_begins_with($users, $letter) {
    $filtered = array();
    !
    foreach ($users as $user) {
    if (0 === strpos($user['name'], $letter)) {
    $filtered[] = $user;
    }
    }
    !
    return $filtered;
    }

    View Slide

  47. function users_name_begins_with($users, $letter) {
    $filtered = array();
    !
    foreach ($users as $user) {
    if (0 === strpos($user['name'], $letter)) {
    $filtered[] = $user;
    }
    }
    !
    return $filtered;
    }
    3. One Return Type

    View Slide

  48. Variable Scope
    http://www.flickr.com/photos/pedrovezini/5747037907

    View Slide

  49. $a = 1; // global scope
    !
    function test() {
    echo $a; // reference to function scope
    }
    !
    test();
    Global Scope

    View Slide

  50. $a = 1; // global scope
    !
    function test($b) {
    echo $b; // reference to function scope
    }
    !
    test($a);
    Local Variable Scope

    View Slide

  51. $a = 1; // global scope
    !
    function test($b) {
    echo $b; // reference to function scope
    }
    !
    test($a);
    Local Variable Scope

    View Slide

  52. $a = 1; // global scope
    !
    function test() {
    global $a;
    echo $a; // reference to function scope
    }
    !
    test($a);

    View Slide

  53. $a = 1; // global scope
    !
    function test() {
    global $a;
    echo $a; // reference to function scope
    }
    !
    test($a);

    View Slide

  54. $a = 1; // global scope
    !
    function test() {
    global $a;
    echo $a; // reference to function scope
    }
    !
    test($a);
    1

    View Slide

  55. $a = 1; // global scope
    !
    function test() {
    global $a;
    echo $a; // reference to function scope
    }
    !
    test($a);
    1
    Avoid using global

    View Slide

  56. $a = 1; // global scope
    !
    function test() {
    global $a;
    echo $a; // reference to function scope
    }
    !
    test($a);
    1
    Avoid using global
    and its friend $GLOBAL

    View Slide

  57. $_GET!
    $_POST!
    $_SERVER!
    $_FILES
    Superglobals
    $_COOKIE!
    $_SESSION!
    $_REQUEST!
    $_ENV

    View Slide

  58. Imagine you're @ http://domain.com/hello.php?name=john
    !
    function test() {
    echo $_GET['name'];
    }
    !
    test();
    Super Global Scope

    View Slide

  59. Imagine you're @ http://domain.com/hello.php?name=john
    !
    function test() {
    echo $_GET['name'];
    }
    !
    test();
    Super Global Scope

    View Slide

  60. Imagine you're @ http://domain.com/hello.php?name=john
    !
    function test() {
    echo $_GET['name'];
    }
    !
    test();
    Super Global Scope
    john

    View Slide

  61. 4. Control In and Out
    Control what goes in!
    and what comes out

    View Slide

  62. 4. Control In and Out
    Control what goes in!
    and what comes out
    Arguments

    View Slide

  63. 4. Control In and Out
    Control what goes in!
    and what comes out
    Return
    Arguments

    View Slide

  64. function users_name_begins_with($users, $letter) {
    $filtered = array();
    !
    foreach ($users as $user) {
    if (0 === strpos($user['name'], $letter)) {
    $filtered[] = $user;
    }
    }
    return $filtered;
    }

    View Slide

  65. function users_name_begins_with($users, $letter) {
    $filtered = array();
    !
    foreach ($users as $user) {
    if (0 === strpos($user['name'], $letter)) {
    $filtered[] = $user;
    }
    }
    return $filtered;
    }
    4. Control In and Out

    View Slide

  66. function users_name_begins_with($users, $letter) {
    $filtered = array();
    !
    foreach ($users as $user) {
    if (0 === strpos($user['name'], $letter)) {
    $filtered[] = $user;
    }
    }
    return $filtered;
    } 4. Control In and Out
    3. One Return Type
    1. Well Named
    2. Change vs Same

    View Slide

  67. combine to make
    Larger Programs
    Small Programs

    View Slide

  68. View Slide

  69. View Slide

  70. View Slide

  71. View Slide

  72. View Slide

  73. View Slide

  74. BUILD SMALL PROGRAMS

    View Slide

  75. unctions in PHP
    Part 1: Writing Your Own Functions
    ƒ

    View Slide