78

Hey there everyone!

It's been a nice run, but all good things come to an end as they say.

This nice thing comes to an end on Jul 2nd, 2026 which is when the domain expires and I've decided to not renew it.

It's been a nice run and I'm grateful to all the active users of our small Fediverse home!


click here if you're interested in the reasonAs for the reason for this decision, it's because Lemmy and the Threadiverse in general didn't turn out into what I envisioned it would be.

For a hot minute it was honestly great but eventually all that remained was tankies propaganda and depressing news. And probably a few non-political communities that sadly don't really offset it for me.

I was pondering on keeping it running even if I don't really use it that much anymore, but then Hetzner announced a significant price change (and you can bet that Lemmy is an unoptimized resource hog) which is not the reason on its own, but the proverbial last straw.


So yeah, that's it I guess. I promised that if the instance ever goes down, I'll let everyone know with enough time and I believe I managed to do it.

I'll maintain the instance until it expires and I'll keep on moderating it of course but it's probably a good time to start looking for a new Threadiverse home.


Yet again, thank you very much to everyone who has been part of this instance! And to many of the friendly admins of other instances!

10
[-] rikudou@lemmings.world 129 points 5 months ago

We have figured out big stuff and small stuff very well! And if it weren't for the little fact they share the same universe, it would be very good general theories.

9
submitted 5 months ago by rikudou@lemmings.world to c/php@programming.dev

cross-posted from: https://chrastecky.dev/post/24

Changing a Readonly Property

So, you know how readonly properties are, well… read-only? Turns out they’re not!

I stumbled upon this mechanism just as PHP started deprecating it — but hey, if you ignore the deprecation warnings, you can still use it up until PHP 9!

A bit of theory first: readonly properties can only be assigned inside a class constructor. After that, they’re supposed to be immutable.

final readonly class ReadonlyClass
{
    public string $someProp;

    public function __construct()
    {
        $this->someProp = 'unchangeable!';
    }
}

The only official way to set such a property outside the constructor is via reflection — but even then, only if the property hasn’t been initialized yet:

final readonly class ReadonlyClass
{
    public string $someProp;
}
$test = new ReadonlyClass();
$reflection = new ReflectionClass(ReadonlyClass::class)->getProperty('someProp');
$reflection->setValue($test, 'changed once!');
var_dump($test->someProp);
$reflection->setValue($test, 'changed twice?');

This produces the predictable result:

string(13) "changed once!"

Fatal error: Uncaught Error: Cannot modify readonly property ReadonlyClass::$someProp

Changing It Multiple Times

Enough stalling — let’s dive in! The magical object that can modify a readonly property (and much more) is ArrayObject.

Normally, you’d use ArrayObject to wrap an array. But it also accepts any object as the backing value — and that’s where the fun begins. Once you know how PHP stores properties internally (which is actually pretty simple), chaos follows.

Let’s start with this class:

final readonly class ReadonlyClass
{
    public string $someProp;
    private string $somePrivateProp;
    protected string $someProtectedProp;

    public function __construct()
    {
        $this->someProp = 'unchangeable?';
        $this->somePrivateProp = 'unchangeable?';
        $this->someProtectedProp = 'unchangeable?';
    }

    public function getSomePrivateProp(): string
    {
        return $this->somePrivateProp;
    }

    public function getSomeProtectedProp(): string
    {
        return $this->someProtectedProp;
    }
}

Now we create an instance and wrap it in an ArrayObject:

$instance = new ReadonlyClass();
$arrayObj = new ArrayObject($instance);

And now comes the fun part:

// simply use the property name for public properties
$arrayObj['someProp'] = 'changeable public!';
// use "\0[FQN]\0[Property name]" for private properties
$arrayObj["\0ReadonlyClass\0somePrivateProp"] = 'changeable private!';
// use "\0*\0[Property name]" for protected properties
$arrayObj["\0*\0someProtectedProp"] = 'changeable protected!';

var_dump($instance->someProp, $instance->getSomePrivateProp(), $instance->getSomeProtectedProp());

This prints:

string(18) "changeable public!"
string(19) "changeable private!"
string(21) "changeable protected!"

And just like that, you’ve changed an unchangeable property. You can modify it as many times as you want. So… what other arcane tricks are possible?

Changing an Enum Value

Enums are basically fancy objects that represent a specific named instance — optionally with a value. The key difference from old userland implementations is that PHP guarantees every enum case is a unique instance that’s always equal to itself, no matter where it’s referenced from.

In other words, an enum is really just a class, and ->value or ->name are plain properties.

enum MyEnum: string {
    case A = 'a';
    case B = 'b';
}

$arrayObj = new ArrayObject(MyEnum::A);
$arrayObj['value'] = 'b';
$arrayObj['name'] = 'C';

var_dump(MyEnum::A->value);
var_dump(MyEnum::A->name);

This prints exactly what you’d expect after reading the previous examples:

string(1) "b"
string(1) "C"

Even more amusing: Running var_dump(MyEnum::A); now prints enum(MyEnum::C).

It won’t actually make it equal to another enum case, but if you use the value somewhere and reconstruct it using MyEnum::from(), you’ll get back MyEnum::B.

If you try to serialize and deserialize it, you’ll get an error — because MyEnum::C doesn’t exist:

var_dump(MyEnum::from(MyEnum::A->value));
var_dump(unserialize(serialize(MyEnum::A)));

The first prints enum(MyEnum::B), while the second throws a warning: Undefined constant MyEnum::C.

Breaking Types

ArrayObject is so powerful that even the type system trembles before it. Types? Mere suggestions!

final class TestTypedClass
{
    public string $str = 'test';
    public bool $bool = true;
    public int $int = 42;
}

$instance = new TestTypedClass();
$arrayObj = new ArrayObject($instance);

$arrayObj['str'] = 5;
$arrayObj['bool'] = 'hello';
$arrayObj['int'] = new stdClass();

var_dump($instance->str, $instance->bool, $instance->int);

Output:

int(5)
string(5) "hello"
object(stdClass)#3 (0) {
}

So if you ever thought “Hmm, this boolean could really use more than two possible values” — now you know how!

Dynamic Properties Everywhere

Some internal classes like Closure, Generator, and DateTime disallow dynamic properties. Nevermore!

$closure = fn () => true;
$arrayObject = new ArrayObject($closure);
$arrayObject['test'] = 'hello';

var_dump($closure->test);
// prints string(5) "hello"

Crashing PHP

And finally — my favourite one! Ever wanted to cause a segmentation fault? Try this:

$exception = new Exception("Hello there!");
$arrayObject = new ArrayObject($exception);
$arrayObject["\0Exception\0trace"] = -1;

var_dump($exception->getTraceAsString());

That gave me one beautiful Segmentation fault (core dumped)!

So, how did you like these all-powerful ArrayObject shenanigans?

426
207
Living in the moment (thelemmy.club)
84
submitted 8 months ago by rikudou@lemmings.world to c/reddit@lemmy.world

They auto-translated Original Poster as Původní plakát where "plakát" does mean "poster" but only the kind that you hang on a wall.

Another win for auto translation.

374
-10
27
submitted 9 months ago* (last edited 9 months ago) by rikudou@lemmings.world to c/rareinsults@lemmy.world
66

The time flies really fast! Exactly 2 years ago I was the one and only user of this instance and now there are thousands of us! So happy birthday to Lemmings.world and hope you all enjoy our small corner of the internet!

6
submitted 10 months ago by rikudou@lemmings.world to c/php@programming.dev

cross-posted from: https://chrastecky.dev/post/16

Starting with PHP 8.5, you'll be able to do the following:

 public function __construct(
    final public string $someProperty,
) {}

This wasn't possible before, as promoted properties couldn't be declared final.

Perhaps the more interesting part is that you can now omit the visibility modifier if you include final. In that case, the property will default to public:

 public function __construct(
    final string $someProperty, // this property will be public
) {}

Personally, I’m not a fan of this behavior — I prefer explicit over implicit. Fortunately, it can be enforced by third-party tools like code style fixers. Still, I would have preferred if the core required the visibility to be specified.

What do you think? Do you like this change, or would you have preferred a stricter approach?

13
submitted 10 months ago by rikudou@lemmings.world to c/php@programming.dev

cross-posted from: https://chrastecky.dev/post/13

This change is quite straightforward, so this won’t be a long article. PHP 8.5 adds support for annotating non-class, compile-time constants with attributes. Compile-time constants are those defined using the const keyword, not the define() function.

Attributes can now include Attribute::TARGET_CONSTANT among their valid targets. Additionally, as the name suggests, Attribute::TARGET_ALL now includes constants as well. The ReflectionConstant class has been updated with a new method, getAttributes(), to support retrieving these annotations.

One particularly useful aspect of this change is that the built-in #[Deprecated] attribute can now be applied to compile-time constants.

As promised, this was a short post, since the change is relatively simple. See you next time—hopefully with a more exciting new feature in PHP 8.5!

[-] rikudou@lemmings.world 142 points 1 year ago

Google Search. Or search in general. Now it's all shit and you have to convince it that you actually want to search what you want and not what it thinks you want. Which is sometimes hard and other times impossible. I miss Google Search, it seriously was the best.

[-] rikudou@lemmings.world 211 points 2 years ago

The cracks, they don't remove our protection. The cracks still have all our code in and all our code is executed. There is even more code on top of the cracked code - that is executing on top of our code, and causing even more stuff to be executed. So there is technically no way that the cracked version is faster than the uncracked version. That's simply a technical fact.

Going by that logic, there's simply no way that Denuvo does not hinder performance.

[-] rikudou@lemmings.world 278 points 2 years ago

It's sad that this is considered malicious at all. Seriously, either working from home is a risk for your company or it isn't, there's nothing in between.

[-] rikudou@lemmings.world 152 points 2 years ago

It's gotten better. A lot. More people means more content. Sure, I have to curate it a bit, but overall it's better.

[-] rikudou@lemmings.world 356 points 2 years ago

46.6˚C in normal units.

[-] rikudou@lemmings.world 145 points 2 years ago

What dystopia do you guys live in? I've worked for some small companies and some corporates and neither did this shit, that really wouldn't fly here.

[-] rikudou@lemmings.world 127 points 2 years ago

I'm a simple man, I see blockchain, I downvote.

[-] rikudou@lemmings.world 234 points 2 years ago

Nice, seems like we're finally getting to the point where we stop blaming the common people for climate change.

[-] rikudou@lemmings.world 176 points 2 years ago

Very misleading title. You cannot actually install Chrome extensions which is what I assumed after reading the title.

What this does is that when migrating from Chrome, you can automatically install supported extensions that are also in the Mozilla addons store.

[-] rikudou@lemmings.world 159 points 2 years ago

Tldr: the new store only supports snaps, deb support will come later. OP, please provide summary next time if you link to clickbait articles.

[-] rikudou@lemmings.world 131 points 2 years ago

Like it so far, not looking for anything else.

view more: next ›

rikudou

0 post score
0 comment score
joined 2 years ago
MODERATOR OF