<?php
def_sprintfer('a', "<a href='%s'>%s</a>");
def_sprintfer('img', "<img src='%s'>");
def('def_tag',function($name){
def_sprintfer($name, "<{$name}>%s</{$name}>\n");
});
foreach(array('p','div','html','head','body','title', 'h1') as $tag)
def_tag($tag);
echo html(head(title('Hello, World!')).
body(div(h1('Hello, World!')).
div(p("This is a page about world!").
a("http://world.com", img("http://world.com/logo.jpg")))));
---
<html><head><title>Hello, World!</title>
</head>
<body><div><h1>Hello, World!</h1>
</div>
<div><p>This is a page about world!</p>
<a href='http://world.com'><img src='http://world.com/logo.jpg'></a></div>
</body>
</html>
core
1.simple-define.php
<?php
// Простой пример, как определить функцию с помощью bu.defun
def('hello', function(){ echo "Hello!"; });
hello();
?>
---
Hello!
2.undef.php
<?php
// С помощью undef можно разопределить функцию.
def('say', function(){ echo "one\n"; });
say();
def('say', function(){ echo "two\n"; });
say();
undef('say');
say();
?>
---
one
two
one
3.redefine.php
<?php
// С помощью bu.defun можно переопределять функции:
def('name', function(){
echo "Waserd";
});
name();
echo "\n";
def('name', function(){
echo "Bubujka";
});
name();
?>
---
Waserd
Bubujka
4.absolute-undef.php
<?php
// При использовании undef - удаляется только последняя функция.
// Чтобы удалить всё - надо передать true вторым аргументом
for($i = 1; $i<5; $i++)
def_printfer('say', "$i\n");
say();
undef('say');
say();
undef('say', true);
try{
say();
}catch(Exception $e){
echo "Catched!";
}
---
4
3
Catched!
<?php
// При объявлении функций - возвращается замыкание.
$fn = def('up', function($str){
return strtoupper($str);
});
echo up('hello, world')."\n";
echo $fn('world, hello');
---
HELLO, WORLD
WORLD, HELLO
def_accessor
1.def_accessor.php
<?php
// def_accessor создаёт функцию, которая хранит в себе определённое значение и
// возвращает его при вызове. Ей можно передать в качестве аргумента новое
// значение
def_accessor('user');
if(is_null(user()))
echo "null\n";
user('waserd');
echo user();
---
null
waserd
2.def_accessor_with_default_value.php
<?php
// Второй аргумент в функции - значение по умолчанию.
def_accessor('user', 'waserd');
echo user()."\n";
user('bubujka');
echo user();
---
waserd
bubujka
3.return_old_value_on_set.php
<?php
// При установке нового значения - функция вернёт старое
def_accessor('user', 'waserd');
echo user('bubujka')."\n";
echo user();
---
waserd
bubujka
def_matcher
def_matcher.php
<?php
// def_matcher - объявляет функцию, которая сопоставляет свой аргумент с
// регулярным выражением
echo (int)function_exists('is_az');
def_matcher('is_az', '/^[a-z]+$/');
echo (int)function_exists('is_az');
foreach(array('', '1', 'a2', 'E', '_') as $v)
echo (int)is_az($v);
foreach(array('a', 'qwerty') as $v)
echo (int)is_az($v);
---
010000011
def_wrapper
1.def_wrapper-undef_wrapper.php
<?php
// При оборачивании функций с помощью def_wrapper - их можно всегда можно
// развернуть обратно
$wrapper = function($call){
$call->args[0]++;
echo ">";
$call();
};
def('say', function($i){ echo $i."\n"; });
say(1);
def_wrapper('say', $wrapper);
say(1);
def_wrapper('say', $wrapper);
say(1);
undef_wrapper('say');
say(1);
undef_wrapper('say');
say(1);
?>
---
1
>2
>>3
>2
1
2.argument-overwrite-in-def_wrapper.php
<?php
// Оборачивая функцию с помощью def_wrapper возможно переопределять
// передаваемые аргументы
def('m2', function($i){ return $i * 2; });
def_wrapper('m2', function($call){ return $call(3); });
echo m2(2);
?>
---
6
deflet
deflet.php
<?php
// С помощью deflet можно выполнить участок кода, так что
// определённые/переопределённые функции не будут видны за его пределами
def_printfer("say", "one\n");
say();
deflet(function(){
def_printfer("say", "two\n");
say();
});
say();
?>
---
one
two
one
functions
def-state-fns.php
<?php
// def_state_fns принимает 4 аргумента:
// - название для функции возвращающей нормальное значение
// - ................................. инвертированное значение
// - функция, которая устанавливает значение
// - ................ возвращает значение
// Ниже рассмотрен пример авторизации пользователя, с хранением значения в
// в сессии:
session_start();
def_state_fns('is_user', 'is_guest',
function($v){
$_SESSION['is_user'] = $v;
},
function(){
return isset($_SESSION['is_user']) ? $_SESSION['is_user'] : false;
});
$pr = function(){
$tf = function($v){ echo ($v ? 'true' : 'false')."\n";};
$tf(is_user());
$tf(is_guest());
};
//default state
$pr();
//inverse state
is_user(true);
$pr();
//set over is_guest();
is_guest(true);
$pr();
?>
---
false
true
true
false
false
true
def_alias.php
<?php
// def_alias - создаёт алиас для функции.
def('one', function(){ echo 1; });
def_alias('one', 'two');
one();
two();
?>
---
11
<?php
// def_constructor принимает в качестве первого аргумента имя создаваемой
// функции. Функция будет конструировать массивы получая лишь значения для
// полей.
def_constructor('mk_user', 'name', 'age');
$one = mk_user('alex', 21);
$two = mk_user('sasha', 28);
foreach(array($one,$two) as $u){
foreach($u as $k=>$v)
echo $k.": ".$v."\n";
echo "-\n";
}
---
name: alex
age: 21
-
name: sasha
age: 28
-
def_converter.php
<?php
// def_converter служит для создания преобразующих функций. Она создаёт 2
// функции: к примеру down_to_up - для преобразования 1 аргумента, и
// downs_to_ups для преобразования массива аргументов.
def_converter('down', 'up', function($s){return strtoupper($s);});
echo down_to_up('hello')."\n";
foreach(downs_to_ups(array('wor', 'ld')) as $v)
echo $v."\n";
?>
---
HELLO
WOR
LD
def_printfer.php
<?php
// def_printfer принимает название функции которую надо создать и шаблон.
// Привызове она будет использовать шаблон как первый аргумент для printf.
def_printfer('h1', '<h1>%s</h1>');
h1('hello!');
?>
---
<h1>hello!</h1>
def_return.php
<?php
// def_return создаёт функцию, которая просто возвращает определённое
// значение.
def_return('user_name', 'waserd');
echo user_name();
?>
---
waserd
def_sprintfer.php
<?php
// def_sprintfer - делает тоже что и def_printfer, но используя функцию sprintf
def_sprintfer('h1', '<h1>%s</h1>');
$v = h1('hello!');
echo ">".$v."<";
?>
---
><h1>hello!</h1><
getfn
getfn.php
<?php
// Объявленную через bu.defun функцию всегда можно получить как
// замыкание с помощью getfn
def_printfer('say', "Hello!\n");
$fn = getfn('say');
$fn();
echo "\n";
// Проверим как будет реботать при переопределении
def_printfer('say', "Hello #2!\n");
$fn2 = getfn('say');
$fn();
$fn2();
echo "\n";
// А если ещё и разопределить функцию?..
undef('say');
$fn3 = getfn('say');
$fn();
$fn2();
$fn3();
---
Hello!
Hello!
Hello #2!
Hello!
Hello #2!
Hello!
import
import_ns.php
<?php
// import_ns - импортирует функции в глобальный нэймспэйс из другого.
namespace{
require_once "load.php";
}
namespace foo\bar\baz{
function one(){ echo 1; }
function two(){ echo 2; }
function three(){ echo 3; }
}
namespace{
import_ns('foo\bar\baz');
one();
two();
three();
}
?>
---
123
inspector
def_text_inspector.php
<?php
// def_text_inspector - оборачивает функцию, так что можно следить за её
// вызовом, переданными аргументами и возвращаемыми значениями
set_time_limit(1);
def('inc', function($i){
echo "Increment {$i}\n";
return $i + 1;
});
def_text_inspector('inc');
echo inc(3, 'hello');
?>
---
>> Calling 'inc' function with arguments:
>> - 3
>> - hello
Increment 3
>> return value is '4'
4
<?php
// defmd сохраняет все результаты в bu\def\Memo::$memcached_static_cache
// Это чтобы лишний раз не обращаться к memcached
bu\def\memcached_prefix('bu.def.tests');
defmd('test_md', function($r){
echo '.';
return ($r * 2)."\n";
});
echo test_md(1);
echo test_md(1);
echo test_md(2);
flush_md();
echo test_md(1);
echo test_md(2);
flush_all();
echo test_md(1);
echo test_md(1);
echo test_md(2);
?>
---
.2
2
.4
2
4
.2
2
.4
memo
1.def_memo.php
<?php
// def_memo создаёт функцию, которая хранит все результаты вычислений.
// http://en.wikipedia.org/wiki/Memoization
def_memo('sum', function($a, $b){
echo '.';
return $a+$b;
});
echo sum(1,2)."\n";
echo sum(1,3)."\n";
echo sum(1,2)."\n";
echo sum(2,1);
?>
---
.3
.4
3
.3
2.def_memo_for_singleton.php
<?php
// def_memo может использоваться вместе с объектами
class DB{
static $count = 0;
function __construct(){
self::$count++;
}
function count(){
echo self::$count;
}
}
def_memo('db', function(){
return new DB;
});
db()->count();
db()->count();
db()->count();
---
111
3.def_memo_return_closure.php
<?php
// def_memo возвращает замыкание. его можно использовать по своему усмотрению.
$v = def_memo('sum', function($a, $b){
echo '.';
return $a+$b;
});
echo sum(1,2)."\n";
echo sum(1,3)."\n";
echo sum(1,2)."\n";
echo sum(2,1)."\n";
echo $v(4,5)."\n";
echo $v(1,2)."\n"; // использует ту же память что и sum()?
echo $v(4,5)."\n";
?>
---
.3
.4
3
.3
.9
3
9
modules
1.def.php
<?php
// Используя def возможно создавать статические функции внутри классов. Классы
// не должны быт объявленны ранее.
// Синтаксически это похоже на модули в ruby.
def("hello::world", function($what){
echo "Hello, {$what}!";
});
hello::world('waserd');
---
Hello, waserd!
2.import.php
<?php
// С помощью import возможно загрузить функции в глобальное пространство.
def("foo::one", function(){echo 1;});
def("foo::two", function(){echo 2;});
def("foo::three", function(){echo 3;});
foo::one();
foo::two();
foo::three();
echo "\n";
import("foo");
one();
two();
three();
---
123
123
3.module_def.php
<?php
// Если надо определить несколько функций внутри модуля, то это удобнее сделать
// с помощью функции module.
module('foo', function(){
def('one', function(){echo 1;});
def('two', function(){echo 2;});
def('three', function(){echo 3;});
def_printfer('hello', 'Hello, %s');
});
foo::one();
foo::two();
foo::three();
foo::hello('waserd');
---
123Hello, waserd
ns
1.def.php
<?php
// Используя обратный слэш можно создавать функции внутри другого нэймспэйса
def('foo\bar\baz\hello', function(){ echo "Hello!"; });
foo\bar\baz\hello();
?>
---
Hello!
2.ns_def.php
<?php
// Для создания нескольких функций в другом нэймспэйсе - стоит использовать
// функцию ns().
ns('foo\bar\baz', function(){
def('one', function(){echo 1;});
def('two', function(){echo 2;});
def('three', function(){echo 3;});
def_printfer('hello', 'Hello, %s');
});
foo\bar\baz\one();
foo\bar\baz\two();
foo\bar\baz\three();
foo\bar\baz\hello('waserd');
---
123Hello, waserd