finalclassSomeextendsOption{private$value;publicfunction__construct($value){$this->value=$value;}publicstaticfunctioncreate($value){returnnewself($value);}publicfunctionisDefined(){returntrue;}publicfunctionisEmpty(){returnfalse;}publicfunctionget(){return$this->value;}publicfunctiongetOrElse($default){return$this->value;}publicfunctiongetOrCall($callable){return$this->value;}publicfunctiongetOrThrow(\Exception$ex){return$this->value;}publicfunctionorElse(Option$else){return$this;}/**
* @deprecated Use forAll() instead.
*/publicfunctionifDefined($callable){call_user_func($callable,$this->value);}publicfunctionforAll($callable){call_user_func($callable,$this->value);return$this;}publicfunctionmap($callable){returnnewself(call_user_func($callable,$this->value));}publicfunctionflatMap($callable){$rs=call_user_func($callable,$this->value);if(!$rsinstanceofOption){thrownew\RuntimeException('Callables passed to flatMap() must return an Option. Maybe you should use map() instead?');}return$rs;}publicfunctionfilter($callable){if(true===call_user_func($callable,$this->value)){return$this;}returnNone::create();}publicfunctionfilterNot($callable){if(false===call_user_func($callable,$this->value)){return$this;}returnNone::create();}publicfunctionselect($value){if($this->value===$value){return$this;}returnNone::create();}publicfunctionreject($value){if($this->value===$value){returnNone::create();}return$this;}publicfunctiongetIterator(){returnnewArrayIterator(array($this->value));}publicfunctionfoldLeft($initialValue,$callable){returncall_user_func($callable,$initialValue,$this->value);}publicfunctionfoldRight($initialValue,$callable){returncall_user_func($callable,$this->value,$initialValue);}}