A collection of useful PHP helper functions and utilities with full type safety and comprehensive documentation.
- 🔒 Fully Typed - Complete PHP 8.0+ type declarations for enhanced IDE support
- 📝 Well Documented - Comprehensive PHPDoc comments with examples
- ✅ Thoroughly Tested - High test coverage with edge case testing
- 🔍 Static Analysis - PHPStan Level 8 compliant
- 🎯 Zero Dependencies - Only requires Carbon for date/time utilities
- 🌐 UTF-8 Safe - Multi-byte string operations throughout
- PHP 8.0 or higher
- ext-mbstring
You can install the package via composer:
composer require farzai/support
The Arr class provides utilities for working with arrays using dot notation.
Get an item from an array using dot notation:
use Farzai\Support\Arr;
$array = [
'user' => [
'name' => 'John Doe',
'email' => 'john@example.com',
'address' => [
'city' => 'New York'
]
]
];
// Get nested value
Arr::get($array, 'user.name'); // Returns: 'John Doe'
Arr::get($array, 'user.address.city'); // Returns: 'New York'
// With default value
Arr::get($array, 'user.phone', 'N/A'); // Returns: 'N/A'
// Get entire array
Arr::get($array, null); // Returns: entire $array
Check if a key exists in an array using dot notation:
use Farzai\Support\Arr;
$array = ['user' => ['name' => 'John']];
Arr::exists($array, 'user.name'); // Returns: true
Arr::exists($array, 'user.email'); // Returns: false
Check if a value is array accessible:
use Farzai\Support\Arr;
Arr::accessible(['foo' => 'bar']); // Returns: true
Arr::accessible(new ArrayObject()); // Returns: true
Arr::accessible('string'); // Returns: false
The Str class provides a rich set of string manipulation methods.
use Farzai\Support\Str;
// camelCase
Str::camel('foo_bar'); // Returns: 'fooBar'
Str::camel('foo-bar'); // Returns: 'fooBar'
// StudlyCase (PascalCase)
Str::studly('foo_bar'); // Returns: 'FooBar'
// snake_case
Str::snake('fooBar'); // Returns: 'foo_bar'
Str::snake('FooBar', '-'); // Returns: 'foo-bar'
// lowercase
Str::lower('FOO BAR'); // Returns: 'foo bar'
use Farzai\Support\Str;
Str::isSnakeCase('foo_bar'); // Returns: true
Str::isCamelCase('fooBar'); // Returns: true
Str::isStudlyCase('FooBar'); // Returns: true
use Farzai\Support\Str;
// Replace
Str::replace('foo', 'bar', 'foo baz'); // Returns: 'bar baz'
// Check if starts with
Str::startsWith('foobar', 'foo'); // Returns: true
Str::startsWith('foobar', ['bar', 'foo']); // Returns: true
// Check if ends with
Str::endsWith('foobar', 'bar'); // Returns: true
// Check if contains
Str::contains('foobar', 'oob'); // Returns: true
Str::contains('foobar', ['baz', 'bar']); // Returns: true
// Length (UTF-8 safe)
Str::length('foo'); // Returns: 3
Str::length('ñoño'); // Returns: 4
// Substring (UTF-8 safe)
Str::substr('foobar', 0, 3); // Returns: 'foo'
Str::substr('foobar', 3); // Returns: 'bar'
All random methods use cryptographically secure randomness:
use Farzai\Support\Str;
// Random alphanumeric (base64-like)
Str::random(16); // Returns: 'a3K7mN9pQ1xY2zB5'
// Random ASCII
Str::randomAscii(16);
// Random numeric only
Str::randomNumeric(6); // Returns: '472891'
// Random alphanumeric (A-Z, a-z, 0-9)
Str::randomAlphanumeric(12); // Returns: 'aB3xY9mK2nP7'
// Random with custom character set
Str::randomString(8, 'ABCD123'); // Returns: 'A2B1C3D2'
// Random with special characters (for passwords)
Str::randomStringWithSpecialCharacter(16); // Returns: 'aB3!xY@9#mK2$pQ5'
The Carbon class extends the popular Carbon library with additional convenience methods.
use Farzai\Support\Carbon;
use function Farzai\Support\now;
// Get current date/time
$now = now();
// or
$now = Carbon::now();
// With timezone
$now = now('America/New_York');
$now = Carbon::now('UTC');
// From timestamp
$date = Carbon::fromTimestamp(1609459200);
use Farzai\Support\Carbon;
$today = Carbon::now();
$yesterday = Carbon::yesterday();
$tomorrow = Carbon::tomorrow();
// Check if today
$today->isToday(); // Returns: true
$yesterday->isToday(); // Returns: false
// Check if past
$yesterday->isPast(); // Returns: true
$tomorrow->isPast(); // Returns: false
// Check if future
$tomorrow->isFuture(); // Returns: true
$yesterday->isFuture(); // Returns: false
// Check if between dates
$today->isBetweenDates($yesterday, $tomorrow); // Returns: true
use Farzai\Support\Carbon;
$date = Carbon::now();
// Format as date string
$date->toDateString(); // Returns: '2024-03-18'
// Format as time string
$date->toTimeString(); // Returns: '14:30:45'
// Format as datetime string
$date->toDateTimeString(); // Returns: '2024-03-18 14:30:45'
use Farzai\Support\Carbon;
$date = Carbon::now();
// Start of day
$start = $date->startOfDay(); // Returns: today at 00:00:00
// End of day
$end = $date->endOfDay(); // Returns: today at 23:59:59
use Farzai\Support\Carbon;
$today = Carbon::now();
$yesterday = Carbon::yesterday();
// Absolute difference in days
$today->diffInDaysAbsolute($yesterday); // Returns: 1
Global helper functions in the Farzai\Support namespace.
Execute a callback on a value and return the value:
use function Farzai\Support\tap;
// With callback
$user = tap($user, function ($u) {
$u->update(['last_login' => now()]);
});
// Returns $user after updating
// Without callback (higher-order proxy)
$user = tap($user)
->update(['last_login' => now()])
->save();
// Chains methods but returns $user
Get the current date/time:
use function Farzai\Support\now;
$current = now(); // Returns: Carbon instance
$ny = now('America/New_York'); // Returns: Carbon instance in NY timezone
Get the class name without namespace:
use function Farzai\Support\class_basename;
class_basename('App\Models\User'); // Returns: 'User'
class_basename(new \App\Models\User); // Returns: 'User'
composer test
composer test-coverage
composer format
composer analyze
composer check
Please see CHANGELOG for more information on what has changed recently.
Please see CONTRIBUTING for details.
Please review our security policy on how to report security vulnerabilities.
The MIT License (MIT). Please see License File for more information.