Обновление с новым ответом, основанным на цепочке комментариев в OP
Поскольку вы расширяете базовую форму объекта голосования VoteLike.cfc, CFC совместно используют локальную область потоковых безопасных переменных (если выне хранить это в области приложения или сервера, где это может быть изменено другими).Это означает, что вы устанавливаете значение, такое как Variables.Post, один раз и ссылаетесь на него в любой функции в стеке CFC.
Поэтому измените вашу функцию getPost () на:
beforeValidation("getPost");
private function getPost(){
Variables.Post = model("post").findByKey(this.postID);
}
Теперь внутри любой функции в любом из VoteLike.cfc вы можете ссылаться на Variables.Post.Это означает, что у вас есть один экземпляр Post в локальной области переменных CFC, и вам не нужно передавать его через аргументы или другие области действия.
Оригинальный ответ ниже
The "самый правильный "способ справиться с этим" - передать объект каждой отдельной функции в качестве аргумента.Или добавьте сообщение в качестве свойства объекта голосования, чтобы объект голосования имел доступ к полному объекту сообщения.
<cffunction name="doTheValidation">
<cfargument name="ThePost" type="Post" required="true" />
<cfargument name="TheVote" type="Vote" required="true" />
<!--- do stuff here --->
</cffunction>
Причина, по которой это является плохой практикой, заключается в том, что вы требуете, чтобываши объекты имеют доступ к внешней области действия, которая может существовать или не существовать для выполнения своей работы.Если вы решили, что хотите иметь дело с несколькими голосами или сообщениями на одной странице, вам придется поработать с внешней областью действия, чтобы все заработало правильно.
Вам гораздо лучше обойти свой объектили используя композицию для объединения ваших объектов таким образом, чтобы они знали друг о друге.
Обновление
Что касается проблем производительности, если вы используете композицию, чтобы связать свои объекты вместе, выв итоге останется всего два объекта в памяти, поэтому вам не нужно создавать кучу ненужных объектов Post.Кроме того, передача CFC в функцию в качестве аргумента будет передавать CFC по ссылке, что означает, что он не создает дубликат CFC в памяти, что также должно учитывать ваши проблемы с производительностью.
Пример кодаОбновление
Чтобы проиллюстрировать приведенный выше комментарий «По ссылке», настройте следующие файлы и поместите их в один каталог самостоятельно.
TestObject.cfc :
<cfcomponent output="false">
<cfproperty name="FirstName" displayname="First Name" type="string" />
<cfproperty name="LastName" displayname="Last Name" type="string" />
</cfcomponent>
index.cfm :
<!--- Get an instance of the Object --->
<cfset MyObject = CreateObject("component", "TestObject") />
<!--- Set the initial object properties --->
<cfset MyObject.FirstName = "Dan" />
<cfset MyObject.LastName = "Short" />
<!--- Dump out the object properties before we run the function --->
<cfdump var="#MyObject#" label="Object before passing to function" />
<!--- Run a function, sending the object in as an argument, and change the object properties --->
<cfset ChangeName(MyObject) />
<!--- Dump out the object properites again, after we ran the function --->
<cfdump var="#MyObject#" label="Object after passing to function" />
<!--- Take a TestObject, and set the first name to Daniel --->
<cffunction name="ChangeName">
<cfargument name="TheObject" type="TestObject" required="true" hint="" />
<cfset Arguments.TheObject.FirstName = "Daniel" />
</cffunction>
Когда вы запустите index.cfm, вы заметите, что первый дамп имеет FirstName как Dan, аВторой имеет имя как Даниил.Это потому, что CFC передаются в функции по ссылке, что означает, что любые изменения, сделанные в этой функции, вносятся в исходный объект в памяти.Следовательно, нет воссоздания объектов, поэтому производительность не падает.
Дан