1. Go to this page and download the library: Download spaf/simputils library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
use function spaf\simputils\basic\url;
PHP::init();
$url = url('localhost', ['booo', 'fooo'], ['godzila' => 'tamdam', '#' => 'jjj'], port: 8080);
pr($url, "{$url}");
use function spaf\simputils\basic\url;
PHP::init();
$url = url(
// It will first parse this, and extract all the relevant stuff
'http://my.spec.domain.com.ru.at/path1/path2?param1=val1¶m2=val2',
// Then it will use path and add it to the existing path
['path_3', 'path_4'],
// And after that adds the params to existing ones (or overrides them by key)
[
'param_30' => 'val-30',
'param_40' => 'val-40',
// Sharpy can be defined/redefined like this
'#' => 'new-sharpy!'
]
);
pr($url, "{$url}");
use function spaf\simputils\basic\url;
PHP::init();
$url = url(
// It will first parse this, and extract all the relevant stuff
'http://my.spec.domain.com.ru.at/path1/path2?param1=val1¶m2=val2',
// Then it will use path and add it to the existing path
['path_3', 'path_4'],
// And after that adds the params to existing ones (or overrides them by key)
[
'param_30' => 'val-30',
'param_40' => 'val-40',
// Sharpy can be defined/redefined like this
'#' => 'new-sharpy!'
]
);
$path = $url->path;
$path->append('HUGE-PATH-ADDITION');
$path[1] = 'I_REPLACED_PATH2_PIECE';
$stringified_path = "My path really is: {$path}";
pr($stringified_path);
use function spaf\simputils\basic\url;
PHP::init();
$url = url(
// It will first parse this, and extract all the relevant stuff
'http://my.spec.domain.com.ru.at/path1/path2?param1=val1¶m2=val2',
// Then it will use path and add it to the existing path
['path_3', 'path_4'],
// And after that adds the params to existing ones (or overrides them by key)
[
'param_30' => 'val-30',
'param_40' => 'val-40',
// Sharpy can be defined/redefined like this
'#' => 'new-sharpy!'
]
);
// Important, here is the assigning by reference, not cloning!
$path = $url->path;
$path->append('HUGE-PATH-ADDITION');
$path[1] = 'I_REPLACED_PATH2_PIECE';
pr($url, "{$url}");
use spaf\simputils\Boolean;
use spaf\simputils\PHP;
use function spaf\simputils\basic\fl;
use function spaf\simputils\basic\pd;
use function spaf\simputils\basic\pr;
ter write: {$file->size_hr}");
pr("Content of the file: \"{$file->content}\"");
pr("===============================");
pr("Does file exist before moving from ram: ".Boolean::to($file->exists));
$file->move('/tmp', 'LOCAL_FILE_SYSTEM_FILE_random_name.txt');
pr("Does file exist after moving to HD: ".Boolean::to($file->exists));
pr("===============================");
// The location pointed is exactly the same, where we saved the file from RAM
$new_file = fl("/tmp/LOCAL_FILE_SYSTEM_FILE_random_name.txt");
pr("File {$new_file} | exists: ".Boolean::to($new_file->exists));
pr("File {$new_file} | size: {$new_file->size_hr}");
pr("File {$new_file} | content: \"{$new_file->content}\"");
// Moving from RAM to HD is possible, but from HD to RAM is not yet implemented.
// IMPORTANT: "content" read or write DOES REAL READING/WRITING EVERY SINGLE CALL!
// So please if you need to use it multiple times in code - please store it in a var
use spaf\simputils\models\files\apps\JsonProcessor;
use spaf\simputils\models\files\apps\TextProcessor;
use spaf\simputils\PHP;
use function spaf\simputils\basic\bx;
use function spaf\simputils\basic\fl;
use function spaf\simputils\basic\pr;
ocessor();
pr("Textual content of the file: ", $fl->content);
use spaf\simputils\attributes\Property;
use spaf\simputils\generic\BasicResource;
use spaf\simputils\generic\BasicResourceApp;
use spaf\simputils\models\File;
use spaf\simputils\PHP;
use function spaf\simputils\basic\fl;
use function spaf\simputils\basic\pr;
d $fd, ?BasicResource $file = null): mixed {
return $this->_dummy_text;
}
/**
* @inheritDoc
*/
public function setContent(mixed $fd, mixed $data, ?BasicResource $file = null): void {
$this->dummy_text = $data;
}
}
PHP::redef(File::class)::$processors['text/plain'] = DummyWrapperProcessor::class;
$file = fl();
pr($file->content);
$file->content = '-- NEW STRING --';
pr($file->content);
use spaf\simputils\FS;
use spaf\simputils\PHP;
use function spaf\simputils\basic\pd;
use function spaf\simputils\basic\pr;
d from the "working_dir"
'data',
]
]);
$data_php = FS::data(['data', 'my-test-php-array-inside.php']);
pr($data_php);
$data_php = FS::data(['data', 'spec', 'my-spec.json']);
pr($data_php);
use spaf\simputils\FS;
use spaf\simputils\PHP;
use function spaf\simputils\basic\pd;
use function spaf\simputils\basic\pr;
pr($data_php->content);
$data_php = FS::dataFile(['data', 'spec', 'my-spec.json']);
pr($data_php->content);
use spaf\simputils\PHP;
use function spaf\simputils\basic\fl;
use function spaf\simputils\basic\pd;
use function spaf\simputils\basic\pr;
use spaf\simputils\PHP;
use function spaf\simputils\basic\fl;
use function spaf\simputils\basic\pd;
use function spaf\simputils\basic\pr;
ile->content);
use spaf\simputils\generic\SimpleObject;
use spaf\simputils\PHP;
// Important to use exactly this DateTime class that is provided by the library
use spaf\simputils\models\DateTime;
int = 22;
#[Property(valid: 'upper')]
protected ?string $_field_str = null;
#[Property]
protected ?DateTime $_field_dt = null;
}
// Always should be ran first in the runtime code
PHP::init();
////////////////////////
$m = new MyObjectOne;
pr($m); // Print out the whole content of the object
$m->field_int = 55.542;
$m->field_str = 'special string that is being normalized transparently';
$m->field_dt = '2000-11-20 01:23:45';
pd($m); // The same as pr(), but it dies after that
use spaf\simputils\attributes\DebugHide;
use spaf\simputils\attributes\Property;
use spaf\simputils\generic\SimpleObject;
use spaf\simputils\PHP;
// Important to use exactly this DateTime class that is provided by the library
use spaf\simputils\models\DateTime;
d ?string $_field_str = null;
#[DebugHide]
#[Property]
protected ?DateTime $_field_dt = null;
#[DebugHide(false)]
#[Property(valid: 'lower')]
protected ?string $_password = null;
}
// Always should be ran first in the runtime code
PHP::init();
////////////////////////
$m = new MyObjectOne;
pr($m); // Print out the whole content of the object
$m->field_int = 55.542;
$m->field_str = 'special string that is being normalized transparently';
$m->field_dt = '2000-11-20 01:23:45';
$m->password = 'MyVeRRy Secrete PaSWorT!@#';
pr($m);
pd("My password really is: {$m->password}");
MyObjectOne Object
(
[field_int] => 22
[field_str] =>
[password] => ****
)
MyObjectOne Object
(
[field_int] => 55
[field_str] => SPECIAL STRING THAT IS BEING NORMALIZED TRANSPARENTLY
[password] => ****
)
My password really is: myverry secrete paswort!@#
use spaf\simputils\PHP;
use spaf\simputils\models\DateTime;
use function spaf\simputils\basic\now;
use function spaf\simputils\basic\pr;
use function spaf\simputils\basic\ts;
// Setting default user output format to Austrian
PHP::init([
'l10n' => 'AT'
]);
foreach (DT::walk('2000-05-05', '2000-05-09', '12 hours') as $dt) {
pr("$dt");
}
// Output would be:
// 05.05.2000 00:00
// 05.05.2000 12:00
// 06.05.2000 00:00
// 06.05.2000 12:00
// 07.05.2000 00:00
// 07.05.2000 12:00
// 08.05.2000 00:00
// 08.05.2000 12:00
// Changing locale settings for the user output to US format
$conf->l10n = 'US';
// Do the same iterations again, and output would be in US format
foreach (DT::walk('2000-05-05', '2000-05-09', '12 hours') as $dt) {
pr("$dt");
}
// Output would be:
// 05/05/2000 12:00 AM
// 05/05/2000 12:00 PM
// 05/06/2000 12:00 AM
// 05/06/2000 12:00 PM
// 05/07/2000 12:00 AM
// 05/07/2000 12:00 PM
// 05/08/2000 12:00 AM
// 05/08/2000 12:00 PM
// The same can be achieved using directly DateTime without DT helper
$conf->l10n = 'RU';
// Both bellow are equivalents. Shortcut is a better choice
$obj1 = new DateTime('2001-05-17 15:00', 'UTC');
$obj2 = ts('2001-06-01 16:00');
foreach ($obj1->walk($obj2, '1 day') as $dt) {
pr("$dt");
}
// Output would be something like:
// 17.05.2001 15:00
// 18.05.2001 15:00
// 19.05.2001 15:00
// 20.05.2001 15:00
// 21.05.2001 15:00
// 22.05.2001 15:00
// 23.05.2001 15:00
// 24.05.2001 15:00
// 25.05.2001 15:00
// 26.05.2001 15:00
// 27.05.2001 15:00
// 28.05.2001 15:00
// 29.05.2001 15:00
// 30.05.2001 15:00
// 31.05.2001 15:00
// 01.06.2001 15:00
// Setting default user output format to Austrian
use function spaf\simputils\basic\ts;
PHP::init([
'l10n' => 'AT'
]);
$dt = ts('2100-12-12 13:33:56.333');
echo "Date: {$dt->date}\n";
echo "Time: {$dt->time}\n";
// Output would be:
// Date: 12.12.2100
// Time: 13:33
// Chained object modification
echo "{$dt->date->add('22 days')->add('36 hours 7 minutes 1000 seconds 222033 microseconds 111 milliseconds')}\n";
// Output would be:
// 05.01.2101
// What is interesting, is that "date" prism just sub-supplying those "add()" methods to the
// target $dt object, so if we check now the complete condition of $dt it would contain all
// those modifications we did in chain above
echo "{$dt->format(DT::FMT_DATETIME_FULL)}";
// Would output:
// 2101-01-05 01:57:36.666033
// And Time prism would work the same way, but outputting only time part
echo "{$dt->time}\n";
// Output would be:
// 01:57
use function spaf\simputils\basic\ts;
$dt = ts('2020-01-09');
echo "{$dt->diff('2020-09-24')}\n";
// Output would be:
// + 8 months 15 days
// You can use any date-time references
$obj2 = ts('2020-05-19');
echo "{$dt->diff($obj2)}\n";
// Output would be:
// + 4 months 10 days
// Just another interesting chained difference calculation
echo "{$dt->add('10 years')->add('15 days 49 hours 666 microseconds')->diff('2022-01-29')}\n";
// Output would be:
// - 7 years 11 months 28 days 1 hour 666 microseconds
use function spaf\simputils\basic\ts;
$dt = ts('2020-01-09');
$dt_backup = clone $dt;
$dt->add('10 years')->add('15 days 49 hours 666 microseconds')->sub('23 months');
echo "{$dt->diff($dt_backup)}\n";
// Output would be:
// - 8 years 1 month 17 days 1 hour 666 microseconds
use function spaf\simputils\basic\ts;
$dt = ts('2020-01-09');
$dt->add('10 years')->add('15 days 49 hours 666 microseconds')->sub('23 months');
echo "{$dt->diff()}\n";
// Output would be:
// - 8 years 1 month 17 days 1 hour 666 microseconds
// This way the diff will use for the first argument the initial value that was saved before first
// "modification" methods like "add()" or "sub()" or "modify()" was applied.
// Reminding, that any of the "modification" methods would cause modification of the target
// DateTime object
use spaf\simputils\PHP;
use function spaf\simputils\basic\pr;
use function spaf\simputils\basic\ts;
$conf = PHP::init([
'l10n' => 'AT'
]);
$dp = ts('2020-01-01')->walk('2020-05-05', '1 day');
pr("$dp");
// Output would be:
// 01.01.2020 00:00 - 05.05.2020 00:00
use spaf\simputils\PHP;
use spaf\simputils\models\DateInterval;
$conf = PHP::init([
'l10n' => 'AT'
]);
$di = DateInterval::createFromDateString('2 days');
pr("$di");
// Output would be:
// + 2 days
use spaf\simputils\PHP;
$phpi = PHP::info();
echo "{$phpi->cpu_architecture}";
use spaf\simputils\PHP;
$phpi = PHP::info();
echo "{$phpi['cpu_architecture']}";
use spaf\simputils\PHP;
$i = 0;
foreach (PHP::info() as $k => $v) {
echo "{$k} ====> {$v}\n";
if ($i++ > 4) {
// Just a small limiter
break;
}
}
$ic = PHP::init([
'l10n' => 'AT',
]);
/**
* @property ?string $name
* @property ?IPv4 $my_ip
*/
class Totoro extends SimpleObject {
#[Property]
protected ?string $_name = null;
#[Property]
protected ?IPv4 $_my_ip = null;
}
$t = new Totoro;
$t->name = 'Totoro';
$t->my_ip = '127.0.0.1/16';
$t->my_ip->output_with_mask = false;
pr("I am {$t->name} and my address is {$t->my_ip} (and ip-mask is {$t->my_ip->mask})");
$bx = bx([
'data-my-attr-1' => 'test',
'data-my-attr-2' => 'test2',
])->htmlAttrAlike();
// You can specify first argument " or ' to control which wrapper symbols are used.
// Or you could even specify callable to pre-process and wrap value automatically!
PHP::init();
class Totoro extends SimpleObject {
protected function ___withStart($obj, $callback) {
pr('PREPARED! %)');
// $callback($obj);
// return true;
}
protected function ___withEnd($obj) {
pr('POST DONE %_%');
}
}
$obj = new Totoro;
with($obj, function () {
pr('HEY! :)');
});
$obj = new Totoro;
with($obj, function ($obj) {
pr('HEY! :)', $obj);
});
// or less elegant way:
with($obj, function () use ($obj) {
pr('HEY! :)', $obj);
});
$obj = new Totoro;
$var1 = 1;
$var2 = 0.2;
$var3 = 'CooCoo';
with($obj, function ($obj) use ($var1, $var2, $var3) {
pr('HEY! :)', $obj, $var1, $var2, $var3);
});