为什么不能让所有方法和属性从任何地方(即public)可以访问?
如果我将属性声明为?你能举一个我可以遇到的问题的例子public吗?
如果我正在写一个课程,我何时将方法设为私有,而不是保护?换句话说,我怎么能预先知道客户端程序员永远不需要覆盖方法?在某种情况下,它有外部因素,如数据库连接?
在我的很多PHP项目中,我最终得到的是具有非公共函数的类,我不打算扩展它们.
最好将这些声明为受保护或私有?
我可以看到两种方式的参数 - 将它们设为私有是一种更为保守的方法,但可以认为如果我希望扩展方法并明确哪些方法由基类扩展,它们可以在以后被保护.
另一方面,使用私有部分反社会,因为它阻止理论上的未来开发人员扩展我的代码而不进行修改?
反思是否打破了私人方法的想法?因为可以从类外部访问私有方法吗?(也许我不理解反思的意思或错过别的东西,请告诉我) http://en.wikipedia.org/wiki/Reflection_%28computer_science%29
编辑: 如果relection打破了私有方法的想法 - 我们是否只将私有方法用于程序逻辑而不用于程序安全?
谢谢
好吧,假设我们有一个类定义的类
public class TestClass
{
private string MyPrivateProperty { get; set; }
// This is for testing purposes
public string GetMyProperty()
{
return MyPrivateProperty;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我们尝试:
TestClass t = new TestClass { MyPrivateProperty = "test" };
Run Code Online (Sandbox Code Playgroud)
TestClass.MyPrivateProperty is inaccessible due to its protection level正如预期的那样,编译失败.
尝试
TestClass t = new TestClass();
t.MyPrivateProperty = "test";
Run Code Online (Sandbox Code Playgroud)
并使用相同的消息再次编译失败.
一切都很好,直到现在,我们都在期待这一点.
但后来写道:
PropertyInfo aProp = t.GetType().GetProperty(
"MyPrivateProperty",
BindingFlags.NonPublic | BindingFlags.Instance);
// This works:
aProp.SetValue(t, "test", null);
// Check
Console.WriteLine(t.GetMyProperty());
Run Code Online (Sandbox Code Playgroud)
在这里,我们设法改变了一个私人领域.
仅使用反射能够改变某个物体的内部状态是不是不正常?
编辑:
感谢到目前为止的回复.对于那些说"你不必使用它"的人:那个班级设计师怎么样,看起来他再也不能承担内部的国家安全了?
我一直在用的Joomla框架,我注意到,他们使用的公约指定的私人或受保护的方法(他们把下划线" _"方法名前),但他们并没有明确声明任何方法public,private或者protected.为什么是这样?它与便携性有关吗?这些public,private或者protected关键字在旧版本的PHP中不可用吗?
如您所知,PHP类具有私有,公共和受保护的关键字.我刚刚开始编写类,我想知道PHP5中类可见性的优点是什么.
当然也有缺点......
如果所有方法都是公共的,除非它们被明确定义为其他方法,是否有必要将方法定义为public?
我有一些功能需要由管理我的软件的一个共同方面的几个类共享.在Java中,我将所有这些类放在同一个包中,并且通用功能将在辅助类中的受保护方法中.
在PHP中,受保护的方法意味着您只能在子类中使用它,因此我当前的解决方案是使方法受到保护,并使所有需要此方法的类扩展帮助程序类.我当前的解决方案的问题是,事实上你不能继承多个类,所以让我说我需要帮助类,即时通讯...
那么,有没有办法让方法可见性与PHP中的java保护相媲美?如果没有,任何更清洁的方法来解决我的问题?
php ×7
oop ×6
c# ×2
reflection ×2
visibility ×2
class ×1
java ×1
junit ×1
private ×1
public ×1