|
также является разделителем для нескольких правил проверки.
Например, допустимо следующее:
$rules = [ "price" => "nullable|numeric|between:0,99" ];
Чтобы использовать это регулярное выражение, вам нужно переключиться на использование array:
$rules = [
'price' => [ 'regex:/(^$|^\d+(,\d{1,2})?$)/' ]
];
Это также указано в документации :
Примечание. При использовании шаблонов regex / not_regex это может необходимо указать правила в массиве вместо использования разделителей каналов, особенно если регулярное выражение содержит символ канала.
blockquote>Кстати, исходное правило также может делать то, что вы хотите, а также может быть написано как:
$rules [ 'price' => [ 'nullable', 'numeric', 'between:0,99' ] ]
Частные члены доступны только в пределах класса, определяющего их.
Защищенные члены доступны в классе, который определяет их и в классах, которые наследуются от этого класса.
Изменить: оба также доступны друзьям своего класса, а в случае защищенных членов - друзьями из их производных классов.
Редактировать 2: использовать то, что имеет смысл в контексте вашей проблемы. Вы должны попытаться сделать членов закрытыми, когда сможете, уменьшить связь и защитить реализацию базового класса, но если это невозможно, используйте защищенные члены. Проверьте C ++ FAQ для лучшего понимания проблемы. Этот вопрос об защищенных переменных также может помочь.
private
является предпочтительным для данных элемента. По умолчанию членами класса C ++ являются private
.
public
является предпочтительным для функций-членов, хотя это вопрос мнения. По крайней мере, некоторые методы должны быть доступны. public
доступен для всех. Это самый гибкий вариант и наименее безопасный. Любой может использовать их, и кто-то может их неправильно использовать.
private
недоступен вообще. Никто не может использовать их вне класса, и никто не может злоупотреблять ими. Даже в производных классах.
protected
является компромиссом, поскольку он может использоваться в производных классах. Когда вы выходите из класса, вы хорошо понимаете базовый класс и стараетесь не злоупотреблять этими членами.
MFC - это C ++-оболочка для Windows API, она предпочитает public
и protected
. Классы, созданные мастером Visual Studio, имеют уродливое сочетание элементов protected
, public
и private
. Но есть некоторые логики для самих классов MFC.
Членами, такими как SetWindowText
, являются public
, потому что вам часто приходится обращаться к этим членам.
Члены, такие как OnLButtonDown
, обрабатывать уведомления, полученные окном. Они не должны быть доступны, поэтому они protected
. Вы можете получить к ним доступ в производном классе, чтобы переопределить эти функции.
Некоторые члены должны выполнять потоки и контуры сообщений, им не следует обращаться или переопределять, поэтому они объявляются как private
В структурах C ++ члены public
по умолчанию. Структуры обычно используются только для данных, а не для методов, поэтому декларация public
считается безопасной.
Уверенный взгляд на вопрос Protected Member Variables . Рекомендуется использовать private по умолчанию (как и C ++ class
ses do) для уменьшения связи. Защищенные переменные-члены чаще всего являются плохой идеей, защищенные функции-члены могут использоваться, например. шаблон шаблона.
Доступ к защищенным элементам возможен из производных классов. Частные не могут.
class Base {
private:
int MyPrivateInt;
protected:
int MyProtectedInt;
public:
int MyPublicInt;
}
class Derived : Base
{
public:
int foo1() { return MyPrivateInt;} // Won't compile!
int foo2() { return MyProtectedInt;} // OK
int foo3() { return MyPublicInt;} // OK
};
class Unrelated
{
private:
Base B;
public:
int foo1() { return B.MyPrivateInt;} // Won't compile!
int foo2() { return B.MyProtectedInt;} // Won't compile
int foo3() { return B.MyPublicInt;} // OK
};
С точки зрения «лучшей практики» это зависит. Если есть даже небольшая вероятность, что кто-то может захотеть получить новый класс из вашего существующего и получить доступ к внутренним членам, сделайте их Защищенными, а не частными. Если они частные, ваш класс может стать трудно унаследовать.
частные и защищенные модификаторы доступа являются одними и теми же, только защищенные члены базового класса могут быть доступны за пределами основного класса в дочернем (производном) классе. Это также относится к наследованию. Но с помощью частного модификатора члены базового класса могут быть доступны только в области или коде базового класса, а его функции-друзья - только '' ''
Атрибуты и методы, отмеченные как protected
, - в отличие от частных - все еще видны в подклассах.
Если вы не хотите использовать или предоставить возможность переопределить метод в возможных подклассах , Я бы сделал их private
.
Защищенные члены могут быть доступны только потомкам класса и кодом в том же модуле. Доступ к частным членам может быть доступен только классу, в котором они были объявлены, и кодом в том же модуле.
Конечно, функции друзей выкидывают это из окна, но хорошо.
private = доступно только материнскому (базовому классу) (т. е. только мой родитель может войти в спальню моего родителя)
protected = доступно по материнской линии (базовому классу) и ее дочерям (то есть только моему родитель может войти в спальню моего родителя, но дал разрешение сына / дочери войти в спальню родителей).
public = доступно материнству (базовому классу), дочери и всем остальным (т.е. только мой родитель может войти в спальня моего родителя, но это вечеринка дома - mi casa su casa)
Все зависит от того, что вы хотите сделать, и того, что вы хотите, чтобы производные классы могли видеть.
class A
{
private:
int _privInt = 0;
int privFunc(){return 0;}
virtual int privVirtFunc(){return 0;}
protected:
int _protInt = 0;
int protFunc(){return 0;}
public:
int _publInt = 0;
int publFunc()
{
return privVirtFunc();
}
};
class B : public A
{
private:
virtual int privVirtFunc(){return 1;}
public:
void func()
{
_privInt = 1; // wont work
_protInt = 1; // will work
_publInt = 1; // will work
privFunc(); // wont work
privVirtFunc(); // wont work
protFunc(); // will work
publFunc(); // will return 1 since it's overridden in this class
}
}
Доступ к защищенному нестатистическому базовому классу может быть доступен членам и друзьям любых классов, полученных из этого базового класса, с помощью одного из следующих:
Публичные члены класса A доступны для всех и для всех.
Защищенные члены класса A недоступны вне кода A, но доступны из кода любого класса, производного от A.
Частные члены класса A недоступны вне кода A или из кода любого класса, производного от A.
Итак, в конечном итоге выбор между защищенным или приватным отвечает на следующие вопросы: сколько доверия вы хотите поместить в программиста производного класса?
По умолчанию предположим, что производному классу не нужно доверять и сделать ваших членов закрытыми. Если у вас есть веские основания для бесплатного доступа к внутренним элементам материнского класса к его производным классам, вы можете защитить их.
частные члены доступны только из класса, защищенные члены доступны в классе и производных классах. Это свойство наследования в языках OO.
В C ++ вы можете иметь частное, защищенное и публичное наследование, которое будет определять, к каким производным классам можно получить доступ в иерархии наследования. C #, например, имеет только публичное наследование.
Причина, по которой защита MFC защищена, заключается в том, что она является основой. Вероятно, вы хотите подклассифицировать классы MFC, и в этом случае необходим защищенный интерфейс для доступа к методам, которые не видны для общего использования класса.