You can see the documentation for all three:
x
Returns: Real
Description: The x value of an instance is the horizontal position in
the current room, measured in pixels. This value can be either 0,
positive or minus, where 0 is the left hand side of the room and
moving right increases x, moving left decreases x (a negative value
for x means that the instance has gone outside the left side of the
room). You can even give x a real value like 12.345, but as you cannot
get .345 of a pixel, the instance may not appear to have moved,
although these values will be maintained and used internally by
GameMaker: Studio and are perfectly valid.
By setting the x (and y) values you can make the object jump around
the room to the position of your choice, or you can add and subtract
to them by smaller amounts to give the illusion of movement without
actually using the built in speed and direction functions. This should
be taken into account when making your games as often one type of
movement lends itself to a particular style of game-play more than
another.
phy_position_x
Returns: Real
Description: This variable can be used to get (or to set) the x
position of the instance within the game room physics world. Please
note that the physics world may present errors when instances are
moved by directly setting this variable as it will interrupt the
continuous simulation.
phy_com_x
Returns: Real
Description: This read-only variable will return the x position of the
instances center of mass. This is calculated automatically based on
the density, inertia and mass of the instance as defined by the
appropriate functions.
As the name implies, the phy_position_x
is the position of the physics object that's representing the object. It's different from the phy_com_x
because the phy_com_x
is at the center of the mass of the physics object, most likely at the center of the object.