O noua provocare PHP by Innobyte

Ieri am lansat o noua provocare PHP.

I-am rugat pe colegii nostri, dar si pe prietenii de pe pagina de facebook Innobyte sa redefineasca functia sad astfel incat sa rezolve problema de mai jos, pentru a face codul sa functioneze.

PHPChallenge

Am primit mai multe solutii creative pentru a executa functia beAwesome(). Iata cateva dintre ele:

Solutia nr.1:

function sad() {

die(“Are you happy now ?”);

}

Solutia nr.2:

Class s

{

Public static c=1;

Public function stop() {}

}

Function sad (){

if (s::c ==1) { s::c = 2; return true; }

Else return new s()

}

Solutia nr.3:

function sad()

{

return false;

}

Solutia nr.4:

<?php

Class TestClass {

public static $c = 0;



public static function switchC() {

self::$c = abs(self::$c - 1);

}



public function stop() {

echo 'Stop! ';

return false;

}

}



function sad() {

TestClass::switchC();

if (TestClass::$c == 1) {

return true;

}

return new TestClass();

}



function beAwesome() {

echo 'Be awsome! :)';

}



if (sad() === true) {

sad()->stop();

beAwesome();

} else {

echo 'Ooops!';

}

Solutia nr.5:

<?php



class human {

public function stop() {

print("http://youtu.be/DgvePeDIt3Y");

}

}



function sad() {

$return = isset($GLOBALS["sad_called"]) && $GLOBALS["sad_called"] === true ? new human() : true;

$GLOBALS["sad_called"] = true;

return $return;

}



function beAwesome() {

print(" Who's your daddy?\n");

}



if (sad()===true) {

sad()->stop();

beAwesome();

}

Solutia nr.6:

<?php

/**

* Class Sad

*

*

*/

class Sad

{

/**

* @var boolean

*/

protected $isSad = true;

/**

* Stop the sadness

*/

public function stop()

{

$this->isSad = false;

}

/**

* Check if sad

*

* @return boolean

*/

public function isSad()

{

return $this->isSad;

}

}

/**

* Weird function that returns true when an object was created...

*

* @return boolean|Sad

*/

function sad()

{

static $sad;

if ($sad instanceof Sad) {

return $sad;

}

$sad = new Sad();

return true;

}

/**

* Method inspired by http://make-everything-ok.com/

*/

function beAwesome()

{

echo PHP_EOL . PHP_EOL . (sad()->isSad() ? 'awesomeness could not be started... :(' : 'awesomeness started...' ). PHP_EOL;

}

// actual (given) code

if (sad() === true) {

sad()->stop();

beAwesome();

}

Ai o solutie mai buna pentru aceasta problema? Impartaseste-o cu noi!

3 thoughts on “O noua provocare PHP by Innobyte”

  1. Salutare, cam tarziu, stiu, dar acum am dat peste acest articol.

    Method chaining este secretul pentru a rezolva exact problema, cu o mica aditie…

    Nu se poate scapa de $this in PHP ca sa arate exact ca in poza codul (vezi constructor), nu stiu daca exista un limbaj in care sa faci inlantuire cu operatorul -> fara sa ai $this (sau this, dar operatorul -> se va adauga in ES6 asa ca nu este posibil momentan) pentru definirea contextului:
    sad() === true) {
    $this->sad()->stop();
    $this->beAwesome();
    }
    }

    public function sad()
    {
    $this->caller = “sad”;
    if($this->state == true) {
    return $this;
    } else {
    $this->state = true;
    return true;
    }
    }

    public function stop()
    {
    echo “Stopped being ” . $this->caller . “!\n”;
    }

    public function beAwesome() {
    echo “I’m awesome!”;
    }

    }
    $a = new Life();
    ?>

    1. Copy paste fara deschiderea php, se pare ca functia sanitara a crezut ca vreu sa fac injection 😀
      class Life
      {
      private $caller = “”;
      private $state = false;
      public function __construct()
      {
      ///// life motto
      if ($this->sad() === true) {
      $this->sad()->stop();
      $this->beAwesome();
      }
      }

      public function sad()
      {
      $this->caller = “sad”;
      if($this->state == true) {
      return $this;
      } else {
      $this->state = true;
      return true;
      }
      }

      public function stop()
      {
      echo “Stopped being ” . $this->caller . “!\n”;
      }

      public function beAwesome() {
      echo “I’m awesome!”;
      }

      }
      $a = new Life();

Leave a Comment

Your email address will not be published.

Scroll to Top