Hasta hace poco, así es como creé objetos sobre la marcha.
$someObj = json_decode("{}");
Luego:
$someObj->someProperty = someValue;
Pero ahora voy con:
$someObj = (object)[];
Entonces como antes:
$someObj->someProperty = someValue;
Por supuesto, si ya conoce las propiedades y los valores, puede establecerlos dentro como se ha mencionado:
$someObj = (object)['prop1' => 'value1','prop2' => 'value2'];
NB: No sé en qué versiones de PHP funciona esto, por lo que deberá tenerlo en cuenta. Pero creo que el primer enfoque (que también es corto si no hay propiedades para establecer en la construcción) debería funcionar para todas las versiones que tienen json_encode / json_decode