Принятый ответ работает, но немного больше объяснений не повредит.
Атрибуты класса не становятся атрибутами экземпляра при создании экземпляра. Они становятся атрибутами экземпляра, когда им присваивается значение.
В исходном коде значение no присваивается атрибуту list
после создания экземпляра; поэтому он остается атрибутом класса. Определение списка внутри __init__
работает, потому что __init__
вызывается после создания экземпляра. В качестве альтернативы, этот код также выдаст желаемый результат:
>>> class a:
list = []
>>> y = a()
>>> x = a()
>>> x.list = []
>>> y.list = []
>>> x.list.append(1)
>>> y.list.append(2)
>>> x.list.append(3)
>>> y.list.append(4)
>>> print(x.list)
[1, 3]
>>> print(y.list)
[2, 4]
Однако запутанный сценарий в вопросе никогда не случится с неизменяемыми объектами, такими как числа и строки, поскольку их значение не может быть изменено без назначения. Например, код, аналогичный оригиналу со строковым атрибутом, работает без каких-либо проблем:
>>> class a:
string = ''
>>> x = a()
>>> y = a()
>>> x.string += 'x'
>>> y.string += 'y'
>>> x.string
'x'
>>> y.string
'y'
Итак, чтобы суммировать: атрибуты класса становятся атрибутами экземпляра тогда и только тогда, когда им присваивается значение после создания, в методе __init__
или нет. Это хорошо, потому что таким образом вы можете иметь статические атрибуты, если никогда не присваиваете значение атрибуту после создания экземпляра.
Да, вы можете использовать slug
в своем route
и сгенерировали url
, например, если вы объявите маршрут примерно так:
Route::get('users/{username}', 'UserController@profile')->where('profile', '[a-z]+');
Затем в вашем контроллере вы может объявить метод следующим образом:
public function profile($username)
{
$user = User::where('username', $username)->first();
}
Здесь username
является вашим slug, и он должен быть строкой из-за where()...
в объявлении маршрута. Если передан integer
, тогда route
не может быть найден и ошибка 404
будет выбрана.
Начиная с Laravel 5.2, если вы используете привязку модели маршрута, вы можете сделать свои маршруты, которые содержат идентификатор объекта, как обычно ( Неявное связывание ). Например:
В routes/web.php
(Laravel 5.3) или app/Http/routes.php
(Laravel 5.2):
Route::get('categories/{category}', 'CategoryController@show');
В вашем CategoryController
:
show (Category $category) {
//
}
Единственное, что вам нужно сделать, это сообщить Laravel прочитать идентификатор из другого столбца, например, столбца slug
, настроив имя ключа в вашей красноречивой модели:
/**
* Get the route key for the model.
*
* @return string
*/
public function getRouteKeyName()
{
return 'slug';
}
Теперь вы можете ссылаться на свой url
, для которого требуется идентификатор объекта с идентификатором slug
вместо id
.