Share value objects that contain the same primitive value as a singleton.
Important
Singleton objects are kept under WeakReference
.
Tip
You can compare objects like primitives through ===
operator!
Value::create('one') === Value::create('one') // This should be true
Value::create('one') === Value::create('two') // This should be false
composer require mpyw/sharable-value-objects
Caution
PHP 8.3.2 is incompatible due to the bug in the PHP core.
class ScreenName
{
// 1. Mixin Sharable trait family
use SharableString;
// 2. Write your instantiation logic here
public static function create(string $value): static
{
// Validation/Assertion
if (!preg_match('/\A@\w{4,15}\z/', $value)) {
throw new \InvalidArgumentException("invalid screen_name: $value");
}
// ** Call static::acquire() to get instance **
return static::acquire($value);
}
// 3. Write your raw presentation logic here
public function value(): string
{
// ** Call $this->getOriginalValue() to retrieve original value **
return $this->getOriginalValue();
}
}
class ScreenNameTest extends TestCase
{
public function testSame(): void
{
// Same parameters yield the same instance
$this->assertSame(
ScreenName::create('@mpyw'),
ScreenName::create('@mpyw'),
);
}
public function testDifferent(): void
{
// Different parameters yield different instances
$this->assertNotSame(
ScreenName::create('@mpyw'),
ScreenName::create('@X'),
);
}
}