Переменная объекта PHP на самом деле не содержит объект (как и во многих других языках) - она содержит «дескриптор» объекта - то есть некоторое значение, которое позволяет идентифицировать объект, найти его и манипулировать им.Эта переменная передается как любая другая - ее можно передавать by-val, by-ref и т. Д. Однако, если вы копируете это значение в другую переменную, все происходит как одинаково, так и отличается от того, что происходит с целым числом или строкой.
Integer / String: значение копируется, поэтому при его изменении другой остается неизменным.
Object: значение копируется, но значение является дескриптором.Таким образом, если этот дескриптор используется для доступа к реальному объекту (который является практически единственным способом использовать этот дескриптор), и этот доступ модифицирует его, тогда другая переменная - независимая, но содержащая тот же дескриптор - будет отражать это изменение.
Так что это на самом деле очень непротиворечиво, только немного не то, что вы ожидаете рассматривать «по значению» и «по ссылке» наивно - поскольку то, что передается, на самом деле отличается для скалярных и объектных переменных.Переменные объекта включают в себя уровень косвенности.
Именно поэтому почти никогда не имеет смысла передавать переменную объекта по ссылке - если только вы не хотите заменить один объект другим в функции.